MySQL 리트코드 | Rising Temperature (DATEDIFF, TIMESTAMPDIFF, DATE_ADD, DATE_SUB)

    728x90

     

    문제

    https://leetcode.com/problems/rising-temperature/description/?envType=study-plan-v2&envId=top-sql-50

    • 전 날(어제)의 기온에 비해 오늘의 기온이 더 높은 날의 id 찾기

     

    테이블

    Weather id recordDate temperature
    1 2025-01-01 10
    2 2025-01-02 25
    3 2025-01-03 20
    4 2025-01-04 30
    • 전 날보다 오늘의 기온이 높은 날의 id는 2, 4

     

    풀이과정

    ▶ DATEDIFF(날짜1, 날짜2) 사용 정답

    # 셀프조인과 DATEDIFF

    • 어제와 오늘의 기온 비교를 위해 셀프 조인을 해줌
    • 조인 조건은 ① recordDate의 날짜가 하루 차이이고, ② 전 날에 비해 기온이 높은 경우에만 조인이 되도록 설정  
      • DATEDIFF(날짜1, 날짜2) : 날짜1 - 날짜2
        • 두 날짜 차이가 하루 차이가 나야 함.
        • 날짜1이 날짜2보다 최근 날짜이면 DATEDIFF값은 1로, 날짜1이 날짜2보다 과거 날짜이면 DATEDIFF값은 -1로 둬야 함.
      • cf. TIMESTAMPDIFF (단위, 날짜1, 날짜2)
        • 두 날짜 간의 차이를 어떤 단위로 표현할 것인지 설정할 수 있음.
        • 단위 예시
    단위  
    초  SECOND
    MINUTE
    HOUR
    DAY
    WEEK
    MONTH
    분기 QUARTER
    YEAR

     

    # 정답

    • SELECT 문으로 id만 조회해주기
    • 셀프 조인, 조인 조건 설정
      • DATEDIFF(날짜1, 날짜2) = 1로 설정해줌 (날짜1이 더 최신 날짜)
      • 전 날의 기온이 당일의 기온보다 높은 경우만 필터링
    1
    2
    3
    SELECT w2.id
    FROM Weather w1
    JOIN Weather w2 ON DATEDIFF(w2.recordDate, w1.recordDate) = 1 AND w1.temperature < w2.temperature
    cs

     

     

    다른 사람 풀이 참고

    ▶ DATEADD (기준 날짜, INTERVAL) 사용 정답

    # 셀프조인과 DATE_ADD

    • 어제와 오늘의 기온 비교를 위해 셀프 조인을 해줌
    • 조인 조건은 ① recordDate의 날짜가 하루 차이이고, ② 전 날에 비해 기온이 높은 경우에만 조인이 되도록 설정  
      • DATE_ADD(기준 날짜, INTERVAL) : 기준 날짜에 INTERVAL 단위만큼 더하기
        • 두 날짜 차이가 하루 차이가 나야 함.
          • DATE_ADD(기준 날짜, INTERVAL 1 DAY)
        • cf. DATE_SUB (기준 날짜, INTERVAL)
          • 기준 날짜에서 INTERVAL 단위만큼 빼주는 함수
        • 여기에서 '단위'는 상단의 TIMESTAMPDIFF 단위 예시 활용 가능

    # 정답

    • SELECT 문으로 id만 조회해주기
    • 셀프 조인, 조인 조건 설정
      • DATE_ADD(기준 날짜, INTERVAL 1 DAY)로 설정해줌 (기준 날짜에 하루 더하기)
      • 전 날의 기온이 당일의 기온보다 높은 경우만 필터링
    1
    2
    3
    4
    5
    SELECT w1.id
    FROM Weather w1
    JOIN Weather w2
    ON w1.recordDate = DATE_ADD(w2.recordDate, INTERVAL 1 DAY)
    WHERE w1.temperature > w2.temperature;
    cs

     

     

     

    728x90

    댓글