180. Consecutive Numbers

Problem

Write a SQL query to find all numbers that appear at least three times consecutively. For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.
문제링크

Answer

1. INNER JOIN을 이용한 풀이

SELECT DISTINCT l.num  AS ConsecutiveNums -- 혹시 몰라서 disctinct
	FROM logs AS l
    		INNER JOIN logs AS l_next ON l.id + 1 = l_next.id -- 셀프조인을 할 때는 새로운 테이블에 이름을 붙여야함, 여기까지는 두번 연속 
    		INNER JOIN logs As l_next2 ON l_next.id +1 = l_next2.id -- 셀프조인 2번 가능함
WHERE l.num = l_next.num AND l_next.num = l_next2.num -- WHERE l.num = l_next.num = l_next2.num -- WHERE절에서 이런식으로 조건 쓸 면 RUN이 안됨

2. 윈도우함수 (LEAD, LAG)를 이용한 풀이

참고) LEETCODE 홈페이지에서 윈도우 함수는 MS SQL Server로 변경해서 풀어야함. MY SQL에서 지원 안됨.

-- 1. LEAD 함수로 풀기
SELECT DISTINCT l.num AS ConsecutiveNums -- 중복을 제거해야하기 때문에 DISTINCT
FROM (
    SELECT num
    , LEAD(num, 1) OVER (ORDER BY id) as next 
    , LEAD(num, 2) OVER (ORDER BY id) as afternext
    FROM logs
     ) l -- FROM절에 서브쿼리
WHERE l.num = l.next and l.num = l.afternext

-- 2. LAG 함수로 풀기
SELECT DISTINCT num AS ConsecutiveNums -- DISTINCT 빼놓지 말고 쓰기
FROM (
    SELECT num
    , LAG(num, 1) OVER (ORDER BY id) as next 
    , LAG(num, 2) OVER (ORDER BY id) as afternext
    FROM logs
     ) l -- FROM 절에 서브쿼리
WHERE l.num = l.next and l.num = l.afternext

2개의 댓글

comment-user-thumbnail
2020년 9월 28일

변수 선언으로 풀이하는 줄 알았는데 이너조인으로도 간편하게 풀 수 있었네요 감사합니다!

1개의 답글