[LeetCode] 180. Consecutive Numbers

주연·2023년 2월 19일
0

SQL 문제 풀이

목록 보기
14/28
post-thumbnail

230219, 230220

문제

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

적어도 3번 연속으로 나오는 숫자 찾기

풀이

window 함수 사용 x

어렵다..
id = id+1 = id+2의 num
이렇게 풀면 되겠지 라고 생각은 했는데 어떻게 구현해야할지 모르겠다.

  • 답 확인
SELECT DISTINCT l.num AS ConsecutiveNums
FROM logs l
    INNER JOIN logs l1 ON l.id + 1 = l1.id
    INNER JOIN logs l2 ON l.id + 2 = l2.id
WHERE l.num = l1.num AND l.num = l2.num

아예 두 번째와 세 번째에 해당하는 값을 행으로 추가해 문제를 푼 것을 확인하였다.
l.id + 1 = l1.id
이게 잘 이해가 안 갔는데

Input:
Logs table:

idnum
11
21
31
42
51
62
72

input이 이럴 때 l.id + 1 = l1.id로 join을 하게 되면

l.idl.numl1.idl1.num
1121
2131
3142

이와 같게 된다. 그래서 이걸 이용해 연속적인 숫자를 구할 수 있다.
다음에 이 문제 한 번 더 풀어야 할 듯 싶다

window 함수 사용

  • 고민

COUNT나 SUM 이용해서 하려고 했으나

SELECT id
    , num  
    , COUNT(id) OVER (PARTITION BY num ORDER BY id) ConsecutiveNums
FROM Logs
ORDER BY id

이렇게 했을 경우

idnumConsecutiveNums
111
212
313
421
514
622
723

결과가 이렇게 나와서 떨어져있어도 num으로 그룹화했기 때문에 누적이 돼서 안되겠다 싶었다. 강의에서 들었던 두 번째와 세 번째 값을 새로 열로 만들어 푸는 수 밖에 없다 생각함.

  • 내가 푼 것
WITH wind AS (
    SELECT id
        , num
        , LEAD(num) OVER (ORDER BY id) le1
        , LEAD(num, 2) OVER (ORDER BY id) le2
    FROM Logs
)

SELECT DISTINCT num AS ConsecutiveNums
FROM wind
WHERE num = le1 and num = le2 

작명 센스..ㅎ window 안 돼서 wind으로 함
이렇게 밖에 안되는데 이게 더 복잡한 느낌

  • 강의 답 확인
SELECT DISTINCT num AS ConsecutiveNums
FROM (
    SELECT num
        , LEAD(num) OVER (ORDER BY id) le1
        , LEAD(num, 2) OVER (ORDER BY id) le2
    FROM Logs
) l
WHERE num = le1 and num = le2 

with문에 해당하는 것을 from 절 서브쿼리에 넣어 사용.

만약 LEAD 대신 LAG를 사용한다면

SELECT DISTINCT num AS ConsecutiveNums
FROM (
    SELECT num
        , LAG(num) OVER (ORDER BY id) le1
        , LAG(num, 2) OVER (ORDER BY id) le2
    FROM Logs
) l
WHERE num = le1 and num = le2 

LEAD를 LAG로만 변경하면 된다. 그럼

numle1le2
1nullnull
11null
111
211
121
212
221

이렇게 세 번째 행에서 비교하겠지

profile
공부 기록

0개의 댓글