[SQL] Consecutive Numbers

Hyunjun Kim·2024년 12월 9일
0

SQL

목록 보기
40/44

문제 링크

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이 다음과 같이 생겼을 경우

idnum
13
23
33
43

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
;

0개의 댓글