문제
Find all numbers that appear at least three times consecutively. Return the result table in any order.
연속된 id에서 3번이상 연속되어 나오는 수를 구하기
테이블 & 예제
[Logs]
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| num | varchar |
+-------------+---------+
[Examples]
Input:
Logs table:
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
Output:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
풀이
임시테이블과 LEAD함수를 활용하여 풀이를 진행했다.
임시 테이블에 LEAD를 활용해서 id, num의 이후 값들을 당겨서 가져오는 테이블을 생성한다.
후에 WHERE절을 활용하여 값이 같고, id의 차이가 1씩임을 확인해서 조건에 맞는 값들만 남겨주었다.
WITH temp AS (
SELECT id,num,
LEAD(id) OVER (ORDER BY id) AS id1,
LEAD(num) OVER (ORDER BY id) AS num1,
LEAD(id,2) OVER (ORDER BY id) AS id2,
LEAD(num,2) OVER (ORDER BY id) AS num2
FROM Logs
)
SELECT DISTINCT(num) AS ConsecutiveNums
FROM temp
WHERE (id1 - id) = 1 AND (id2 - id1) = 1 AND num = num1 AND num1 = num2;
위는 나의 풀이이고, 자기자신을 조인하는 방법을 설명해주어서 하나 더 가져왔다.
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
;
따로 JOIN을 작성하지 않고 FROM 절에 나열하는 방법도 JOIN이 됨을 알게되었다.
마지막으로 메모리, 속도의 측면에서 두 코드를 비교해보았다. (GPT의 도움을 받았다.)
[메모리]
: 나의 풀이가 임시 테이블 사용으로 메모리 최적화가 되었으며, 조인을 여러번 하는 경우에 메모리 사용이 증가한다고 한다.
[실행 속도]
: 속도 또한 테이블이 많이 조인됨에 따라서 속도가 저하되고, 특히 큰 테이블에서 조인은 연산이 느릴 수 있다고 한다. 따라서 대규모 처리에는 나의 방법이 조금 더 효율적이라고 말하고있다.
'코딩테스트 > SQL' 카테고리의 다른 글
SQL > LeetCode Problem Solving: Product Price at a Given Date (AI.ver) (0) | 2024.06.11 |
---|---|
SQL > LeetCode 1164. Product Price at a Given Date (MySQL) (0) | 2024.06.11 |
SQL > LeetCode 619. Biggest Single Number (MySQL) (0) | 2024.06.07 |
SQL > LeetCode 1070. Product Sales Analysis III (MySQL) (0) | 2024.06.06 |
SQL > LeetCode 550. Game Play Analysis IV (MySQL) (0) | 2024.06.04 |