본문 바로가기
SQL/코딩테스트

[leetcode / MySQL] 180. Consecutive Numbers

by Hi_heidi 2024. 1. 31.

문제

💡 Find all numbers that appear at least three times consecutively. Return the result table in any order.

 

테이블 형태

 

풀이

SELECT DISTINCT num0 AS ConsecutiveNums
FROM (SELECT id
            , num AS num0
            , LEAD(num, 1) OVER (ORDER BY id) AS num1
            , LEAD(num, 2) OVER (ORDER BY id) AS num2
        FROM Logs) logs
WHERE num0=num1 AND num1=num2

 

해설

SELECT DISTINCT num0 AS ConsecutiveNums
FROM (SELECT id
            , num AS num0
            , LEAD(num, 1) OVER (ORDER BY id) AS num1
            , LEAD(num, 2) OVER (ORDER BY id) AS num2
        FROM Logs) logs
WHERE num0=num1 AND num1=num2
  • 적어도 3번 연속으로 등장하는 숫자를 찾는 문제다. 윈도우함수를 사용해 풀이하였다
  • 윈도우함수 중 LEAD를 사용해 기준 행의 다음 num, 그 다음 num을 불러와 각 num1, num2로 지정해 새 컬럼을 만든다. 이를 FROM절 서브쿼리로 감싸 새 테이블 logs를 만든다
  • logs 에서 num0=num1 이고 num1=num2 인 행(=연속으로 3번 같은 숫자가 나온 데이터)만 필터링하여, SELECT에서 DISTINCT 조건을 써 중복 없이 해당 숫자를 출력한다
  • num0=num1=num2 라고 썼을 때 case8에서 음수일 경우 값이 출력되지 않는 상황이 나왔는데, 저렇게 나눠서 조건을 써 주니 잘 출력되었다 → it would mean: (a.id = b.id) = c.id. The first expression would evaluate to 1 (if the two ids are equal) or 0 or NULL 즉 세 개의 숫자를 한 번에 같다고 표현했을 때 SQL문법에서는 앞의 두 숫자를 비교하고 같으면 1이라고 판단한 뒤, '1'을 세번째 숫자와 비교할 가능성이 있다 (stackoverflow 참고)