197. Rising Temperature

김요한·2024년 8월 1일
0

리트코드

목록 보기
1/7
post-thumbnail

테이블은 하나이며 테이블 명은 Weather이다
컬럼은 id와 날짜를 나타내는 recordDate,temperature가 있다.

  • 문제
    어제와 비교했을 때 온도가 더 높은 Id를 찾아라
    결과 표는 임의의 순으로 반환해라.

  • Flow
    1.오늘 날짜와 어제 날짜를 분리
    2.오늘 날짜의 온도와 어제 날짜의 온도를 비교하여 오늘 날짜가 더 큰 Id를 선택한다.

  1. DATEDIFF(a.날짜, b.날짜) = 1
    차이가 1인 날짜만 반환
  2. a.온도 > b.온도

Self 조인 풀이

select 
   w1.id
from Weather w1  # w1와 w2 두 테이블을 셀프 조인한다.
join
   Weather w2
on datediff(w1.recordDate,w2.recordDate) = 1
# ON 절에서 ^위 조건을 사용하여 날짜 차이가 1일인 행들만 병합하도록 합니다.
Where w1.temperature > w2.temperature
        # 두 온도 차 중에서  더 높은 온도를 조건 설정

LAG 함수 풀이

WITH WeatherWithLag AS (
    SELECT 
        id,
        recordDate,
        temperature,
        LAG(temperature) OVER (ORDER BY recordDate) AS previous_temp,
        LAG(recordDate) OVER (ORDER BY recordDate) AS previous_date
    FROM Weather /* LAG 함수로 recordDate기준 현재 행에서 이전 행을 
                   불러오는 previous_temp,previous_date 작성*/
)
SELECT 
    id
FROM 
    WeatherWithLag
WHERE         #현재 행과 LAG 함수로 불러들인 이전 행 차이로 조건 설정   
    DATEDIFF(recordDate, previous_date) = 1 
    AND temperature > previous_temp;

데카르트 곱

SELECT 
    w2.id
FROM 
    Weather w1, Weather w2   #두 개 이상의 테이블을 조합하여 모든 가능한 순서쌍을 생성
WHERE 
    DATEDIFF(w2.recordDate, w1.recordDate) = 1 
AND 
    w2.temperature > w1.temperature;
    # 성능상의 이슈를 유발할 수 있으므로, 가능하면 조인 조건을 명시

0개의 댓글