https://leetcode.com/problems/consecutive-numbers/submissions/1473883683/
Table: Logs
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| num | varchar |
+-------------+---------+
In SQL, id is the primary key for this table.
id is an autoincrement column starting from 1.
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.
대략적인 접근 방법은 이러하다.
SELECT ~~ FROM Logs l1, Logs l2, Logs l3 WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1 AND l1.Num = l2.Num AND l2.Num = l3.Num
하지만 SELECT 에서 문제가 생기는데
꼭 Distinct 를 붙여줘야 한다는 점이다.
예를 들어보자면
Logs
table이 다음과 같이 생겼을 경우
id | num |
---|---|
1 | 3 |
2 | 3 |
3 | 3 |
4 | 3 |
Distinct를 사용하지 않았을 때.
SQL query의 결과는 다음과 같다.
ConsecutiveNums |
---|
3 |
3 |
그 이유는 두 개 이상의 구간에서
조건에 맞는 부분이 생겼기 때문인데,
첫 번째 조건에 맞는 부분
| 1 | 3 |
| 2 | 3 |
| 3 | 3 |
두 번째 조건에 맞는 부분
| 2 | 3 |
| 3 | 3 |
| 4 | 3 |
이렇게 두가지의 결과로 SQL Query 결과도 두가지가 나온 것이다. 따라서 Distinct를 써줌으로써 중복 결과를 없앨 수 있다.
SELECT DISTINCT l1.Num AS ConsecutiveNums FROM Logs l1, Logs l2, Logs l3 WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1 AND l1.Num = l2.Num AND l2.Num = l3.Num ;