데이터 놀이터
Leetcode - 180. Consecutive Numbers 본문
728x90
1. 문제
Table: Logs
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| num | varchar |
+-------------+---------+
In SQL, id is the primary key for this table.
id is an autoincrement column.
Find all numbers that appear at least three times consecutively.
Return the result table in any order.
The result format is in the following example.
Example 1:
Input:
Logs table:
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
Output:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
Explanation: 1 is the only number that appears consecutively for at least three times.
https://leetcode.com/problems/consecutive-numbers/
2. 문제 조건
- Find all numbers that appear at least three times consecutively. -> SELF JOIN을 통해서 3번 동일한 값이 나오는지 여부 확인
3. 코드 작성
SELECT DISTINCT(logs.num) AS ConsecutiveNums
FROM logs
INNER JOIN logs AS logs_n ON logs.id + 1 = logs_n.id
INNER JOIN logs AS logs_n_n on logs_n.id + 1 = logs_n_n.id
WHERE logs.num = logs_n.num AND logs_n.num = logs_n_n.num;
번외 - WINDOW 함수 활용
SELECT DISTINCT nums.num AS ConsecutiveNums
FROM (SELECT num
, LEAD(num, 1) OVER (ORDER BY id) AS num_1
, LEAD(num, 2) OVER (ORDER BY id) AS num_2
FROM logs
) AS nums
WHERE nums.num = nums.num_1
AND nums.num_1 = nums.num_2;
4. 회고
- 같은 테이블 안의 값들끼리 비교할때 self join을 적극적으로 사용해야겠다.
- 아직 JOIN의 ON 조건에 수식과 같이 복잡한 조건을 넣을 수 있다는 사실이 익숙하지 않다. 관련 문제를 많이 풀어보면서 다양한 조건들을 넣어봐야겠다.
- ROW를 원하는 기준대로 밀 수 있는 WINDOW 함수인 LEAD를 활용해보았다. 쿼리문 작동 순서를 고려하지 않고 쿼리를 짜서 헤맸다.
- WINDOW 함수 사용시 쿼리문 작동 순서
- WINDOW 함수 활용시 SELECT나 ORDER BY에만 쓸 수 있으므로, WINDOW 함수로 구한 값을 WHERE 문에서는 활용이 불가능하다
- 아래와 같은 쿼리를 짤 경우가 작동이 되지 않는 예시다.
- WINDOW 함수 사용시 쿼리문 작동 순서
SELECT DISTINCT nums.num AS ConsecutiveNums
FROM (SELECT num
, LEAD(num, 1) OVER (ORDER BY id) AS num_1
, LEAD(num, 2) OVER (ORDER BY id) AS num_2
FROM logs
WHERE nums.num = nums.num_1
AND nums.num_1 = nums.num_2) AS nums
;
728x90
'SQL' 카테고리의 다른 글
SQL 기타 - 주의할 점 (0) | 2023.10.07 |
---|---|
SQL 고급 강의 - Window 함수 (0) | 2023.09.30 |
Hackerrank - The Report (0) | 2023.09.24 |
Hackerrank - challenges (0) | 2023.09.24 |
Leetcode - 184. Department Highest Salary (0) | 2023.09.23 |