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는 앞으로, LAG는 뒤로 밀려서 나오는 것을 볼 수 있다.
LEAD : 앞으로 밀기
LAG : 뒤로 밀기
LEAD/LAG(밀 대상, 얼마나 밀건지) OVER (ORDER BY 어떤 column 순서로)
위와 같이 테이블을 만들어 준 뒤, num, next(previous), after_next(before_previous)의 값이 모두 같은 행만 찾아서 그 숫자를 반환해주면 우리가 찾는 3번 연속으로 언급된 숫자를 찾을 수 있다.
'SQL' 카테고리의 다른 글
[Leetcode] IFNULL, JOIN 다중조건 (0) | 2024.05.25 |
---|---|
[Leetcode] SUM/AVG() OVER (ORDER BY ~ ROWS ~) (0) | 2024.05.21 |
[프로그래머스] SQL 반복문, WITH RECURSIVE (0) | 2024.05.21 |
[Leetcode] CROSS JOIN (0) | 2024.05.21 |
[중급 쿼리] INDEX, VIEW, WITH, 함수 생성 (0) | 2024.05.20 |