(25.03.06)
Weather은 날짜 별 온도를 기록한 테이블이다. 전날 대비 온도가 상승한 날짜의 id를 순서없이 리턴해라
날짜를 정렬하기 위해 order by를 사용해야할 것 같은데, 전날 값과 비교하기 위해 마땅한 방법이 생각나지 않는다. 프로시저로 인덱스 접근이 가능한 게 생각나지만 다른 방법이 있을 것 같아 discussion을 확인한 결과 DATEDIFF라는 내장 함수를 사용하라는 조언을 받을 수 있었다.
DATEDIFF(날짜 부분(year, month), 시작 날짜, 끝 날짜, [주의 시작])
DATEDIFF(날짜1, 날짜2): 날짜1-날짜2
... 날짜의 차이를 계산할 수 있다는 점은 알겠지만 여전히 전날과의 비교 즉, 두 데이터의 비교를 어떻게 해야하는지 잘 모르겠다. GPT의 힘을 빌려보자. 아예 모르겠다.
같은 테이블을 self-join하여 길게 테이블을 만드는데, DATEADD(1)로 다음날짜에 대한 정보를 표시하여 두 열을 비교한다. 이 때, 첫 날짜는 무시되는데 어차피 문제에서 구하라고 하는게 전날 대비이기 때문에 첫 날짜는 포함하지 않아도 된다.
SELECT w1.id
FROM Weather w1
JOIN Weather w2
ON DATEDIFF(w1.recordDate, w2.recordDate) = 1
WHERE w1.temperature > w2.temperature;
셀프조인 결과를 확인하기 위해 SELECT * 로 바꾼 결과는 아래와 같다.
GPT코드이기에 당연히 leetcode는 통과이지만
공부를 위해 조금 더 정리해보자.
셀프 조인을 하는 경우는 같은 구조의 정보를 사용하거나 계산하거나 비교하기 위해 사용하며, 조인 조건을 이용해 비교를 진행할 수 있다. 위 문제의 경우 내장함수 DATEDIFF를 사용했는데, 사용하는 데이터베이스 서버에 따라 내장 함수가 다를 수 있다는 점을 염두해두자(ex DATE_ADD)
DATEDIFF 참고: https://brunch.co.kr/@cheonmyung/97