오랑우탄의 반란
LeetCode 리트코드 | 180. Consecutive Numbers (MySQL) LAG, LEAD 본문
반응형
오늘도 오랑이는 문제를 풉니다.
180. Consecutive Numbers
풀이 과정
처음에는 문제에서 요구한 조건을 말그대로 생각해서 having count() 를 사용해 풀고자 했는데 이것은 틀린 풀이입니다.
이유는 l2.num - l1.num = 0 은 숫자를 출력하는 것이 아닌 boolean 값 즉 True/False 를 출력하는 것이기 때문에 적합하지 않기 때문입니다.
having count(l2.num - l1.num = 0) >= 3
대신 아주 간단하게 self join 과 where 조건절을 활용해서 아래와 같이 풀 수 있습니다.
최종 코드
select distinct l1.num as ConsecutiveNums
from logs l1 join logs l2 on l2.id - l1.id = 1
join logs l3 on l3.id - l1.id = 2
where l1.num = l2.num and l2.num = l3.num
with 풀이
LEAD 함수를 활용해 with 로 푼 풀이도 있었습니다.
WITH cte AS (
SELECT *,
LEAD(num, 1) OVER(ORDER BY id) AS num1,
LEAD(num, 2) OVER(ORDER BY id) AS num2,
LEAD(id, 1) OVER(ORDER BY id) AS id1,
LEAD(id, 2) OVER(ORDER BY id) AS id2
FROM Logs
)
SELECT DISTINCT(num) AS ConsecutiveNums
FROM cte
WHERE num = num1 AND num = num2 AND id1 = id + 1 AND id2 = id + 2;
LAG, LEAD
LAG
A 칼럼으로 정렬했을 때 B 칼럼에 대해 직전 X 번째 행의 값을 출력하는 함수로, 직전 값이 없을 경우 Y 를 출력합니다.
LAG(기준칼럼, 직전X번째, 없으면 Y) OVER (ORDER BY 정렬기준)
LEAD
A 칼럼으로 정렬했을 때 B 칼럼에 대해 직후 X 번째 행의 값을 출력하는 함수로, 직전 값이 없을 경우 Y 를 출력합니다.
LEAD(기준칼럼, 직후X번째, 없으면 Y) OVER (ORDER BY 정렬기준)
오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~
반응형