[리트코드 SQL] 197. Rising Temperature

hwan22·2022년 5월 4일
1

SQL 문제풀이

목록 보기
4/5
post-thumbnail

문제 링크

https://leetcode.com/problems/rising-temperature/
(해당 문제 저작권은 LeetCode에 있습니다.)


문제

전날과 비교해서 온도가 높은 날의 id값을 출력하는 쿼리를 작성해보자.

Self Join을 활용하는 문제


풀이

  • 이 문제는 test 데이터와 sample 데이터의 id 체계가 다른게 핵심.

단순하게 생각해서 id 칼럼을 조인 기준으로 잡고 풀고 Run Code 누르면 Accepted 됐다고 뜬다.

근데...
최종 Submit 하면
아래와 같이 결과창이 뜬다.

test Input 결과를 나열해서 보면 아래와 같다.

idrecordDatetemperature
12000-12-163
22000-12-15-1

문제의 Sample Input 테이블을 일부를 보면 다음과 같다.

idrecordDatetemperature
12015-01-0110
22015-01-0225

즉, test 데이터는 id가 올라갈수록 날짜가 줄어지만, sample 데이터는 id가 올라갈수록 날짜가 늘어난다.

이 문제는 id 칼럼 기준으로 조인을 단순하게 하는 것이 아니라,
recordDate 칼럼 기준으로 하도록 하는 것이 출제자의 의도라고 한다.


최종 쿼리

SELECT today.id
FROM Weather AS today
    INNER JOIN Weather AS yesterday 
    			ON DATE_ADD(yesterday.recordDate, INTERVAL 1 DAY) = today.recordDate
WHERE today.temperature > yesterday.temperature;

⛔️ Datetime 값에 숫자 더하는 함수

  • datetime 값에 1을 빼도 계산되지 않음 -> 시간을 더하고 빼는 함수 사용해야함!

    	ex) yesterday.recordDate  - 1 이런식으로 하면 계산 안됨.
  1. DATE_ADD(기준날짜, INTERVAL ★)
    ex) 지금 날짜시간 기준으로 하면 1초를 더하고 싶으면,
    DATE_ADD(NOW( ), INTERVAL 1 SECOND) MINUTE, HOUR, DAY, MONTH, YEAR 도 가능
  1. DATE_SUB(기준날짜, INTERVAL ★)
    DATE_ADD 방식과 동일.
    혹은, DATE_ADD(NOW( ), INTERVAL - 1 SECOND) DATE_ADD 함수로도 빼기 가능.

📌 Self JOIN 할 때 TIP

  1. 조인 테이블이 같기 때문에 테이블에 무조건 서로 다른 Alias 붙여줌.

  2. 칼럼도 같기 때문에 헷갈리면 각 테이블 칼럼마다 Alias 명확하게 주어 확인하는 것도 좋다.

ex)

SELECT today.id AS today_id,
       today.recordDate AS today_recordDate,
       today.Temperature AS today_Temperature,
       yesterday.id AS yesterday_id,
       yesterday.recordDate AS yesterday_recordDate,
       yesterday.Temperature AS yesterday_Temperature

FROM Weather AS today
            INNER JOIN Weather AS yesterday ON yesterday.id + 1 = today.id

💡 문제 풀면서 헷갈렸던 부분

  • 조인할 때 ON yesterday.id + 1 = today.id 처럼 조건을 줘도 되는지..? 했는데 가능하다고 한다.

  • test 데이터와 sample 데이터의 id 체계가 다른전 전혀 생각지고 못했음.
profile
기록의 공간

0개의 댓글