문제
💡 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 참고)
'SQL > 코딩테스트' 카테고리의 다른 글
[프로그래머스 / MySQL] 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2024.02.01 |
---|---|
[프로그래머스 / MySQL] 나이 정보가 없는 회원 수 구하기 (0) | 2024.02.01 |
[leetcode / MySQL] 262. Trips and Users (0) | 2024.01.31 |
[leetcode / MySQL] 570. Managers with at Least 5 Direct Reports (0) | 2024.01.31 |
[프로그래머스 / MySQL] 있었는데요 없었습니다 (0) | 2024.01.31 |