SQL

[Leetcode] LEAD, LAG

DAdiary 2024. 5. 21. 11:49

180. Consecutive Numbers

 

lags 테이블에서 연속으로 3번 이상 언급된 숫자를 추출하는 문제였다.

 

 

[정답]

-- LEAD를 사용한 풀이
SELECT DISTINCT sub.Num AS ConsecutiveNums
FROM (SELECT Num,
        LEAD(Num, 1) OVER (ORDER BY Id) AS next,
        LEAD(Num, 2) OVER (ORDER BY Id) AS after_next
      FROM Logs) sub
WHERE sub.Num = sub.next AND sub.next = sub.after_next


-- LAG를 이용한 풀이
SELECT DISTINCT sub.Num AS ConsecutiveNums
FROM (SELECT Num,
             LAG(Num, 1) OVER (ORDER BY Id) AS previous,
             LAG(Num, 2) OVER (ORDER BY Id) AS before_previous
      FROM Logs) sub
WHERE sub.Num = sub.previous AND sub.previous = sub.before_previous

FROM 절의 LEAD Subquery
FROM 절의 LAG Subquery

 

FROM에 서브쿼리만 돌려보면 위와 같이 LEAD는 앞으로, LAG는 뒤로 밀려서 나오는 것을 볼 수 있다.

LEAD : 앞으로 밀기

LAG : 뒤로 밀기

LEAD/LAG(밀 대상, 얼마나 밀건지) OVER (ORDER BY 어떤 column 순서로)

 

위와 같이 테이블을 만들어 준 뒤, num, next(previous), after_next(before_previous)의 값이 모두 같은 행만 찾아서 그 숫자를 반환해주면 우리가 찾는 3번 연속으로 언급된 숫자를 찾을 수 있다.