Consecutive Numbers - LeetCode
Consecutive Numbers - LeetCode
Can you solve this real interview question? Consecutive Numbers - Table: Logs +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | num | varchar | +-------------+---------+ id is the primary key for this table. id is an
leetcode.com
LAG, LEAD 함수 연습을 위해 찾은 문제다.
문제설명
Write an SQL query to find all numbers that appear at least three times consecutively.
Return the result table in any order.
핵심은 num 속성이 연속해서 3번 이상 반복되는지 체크하면 된다.
LAG, LEAD 함수는 주로 연속을 확인하는 경우 자주 활용된다.
문제풀이
3번 연속 반복이 된다면 세번째 반복되는 값 기준으로 그 전 값과 그 전전 값이 같으면 된다.
STEP1
LAG 함수를 활용해서 파생변수를 만들어준 뒤, 값이 같은지 확인하면 된다.
STEP2
위에서 만든 쿼리를 FROM절 안에 서브쿼리로 넣어준 뒤, WHERE절을 활용하면 된다.
SELECT DISTINCT(num) AS ConsecutiveNums
FROM (
SELECT *
, LAG(num, 1) OVER (ORDER BY id) AS PREV_NUM1
, LAG(num, 2) OVER (ORDER BY id) AS PREV_NUM2
FROM Logs
) A
WHERE num=PREV_NUM1 AND num=PREV_NUM2
여기서 주의할 점은 DISTINCT 함수를 사용해야하는 점이다.
그렇지 않으면 연속해서 4번 이상 반복되는 숫자는 중복되어 출력된다.
비슷한 방식으로 풀이하면 LEAD를 활용하는 것은 어렵지 않다.
+ 다른 풀이
SELECT DISTINCT a1.num AS ConsecutiveNums
FROM Logs a1 join Logs a2 ON a1.id = a2.id + 1 AND a1.num = a2.num
JOIN Logs a3 ON a1.id = a3.id + 2 AND a1.num = a3.num
JOIN을 이용해 푸는 방법이다. 접근 방식은 비슷한데 뭔가 모르게 코드가 더러운 느낌이다.
'CODING TEST > SQL - 문제' 카테고리의 다른 글
[프로그래머스] 상품 별 오프라인 매출 구하기 / JOIN - MYSQL (0) | 2023.03.09 |
---|---|
[LEETCODE] 184. Department Highest Salary - MySQL 풀이 (0) | 2023.02.14 |
[HACKERRANK] OCCUPATIONS - MYSQL 풀이 (0) | 2023.01.24 |
[solvesql] 작품이 없는 작가 찾기 (0) | 2023.01.16 |
[프로그래머스] 조건에 맞는 도서 리스트 출력하기 - MySQL (0) | 2023.01.12 |