오랑우탄의 반란

LeetCode 리트코드 | 180. Consecutive Numbers (MySQL) LAG, LEAD 본문

SQL/LeetCode

LeetCode 리트코드 | 180. Consecutive Numbers (MySQL) LAG, LEAD

5&2 2024. 7. 19. 10:51
반응형

 

오늘도 오랑이는 문제를 풉니다.

 

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 정렬기준)

 

 

 

오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~

 

 

https://leetcode.com/problems/consecutive-numbers/

반응형