2025. 3. 12. 14:08ㆍSQL
🔗 문제 링크
https://leetcode.com/problems/human-traffic-of-stadium/description/🔓 문제 풀이
풀이1>
WITH get_previous AS (
SELECT id,
visit_date,
people,
LAG(id) OVER (ORDER BY id) AS previous_id
FROM Stadium
WHERE people >= 100
),
get_diff_id AS (
SELECT id,
visit_date,
people,
previous_id,
IF(id - previous_id = 1, 0, 1) AS diff_condition
FROM get_previous
),
get_consecutive_group AS (
SELECT id,
visit_date,
people,
previous_id,
diff_condition,
SUM(diff_condition) OVER (ORDER BY id) AS group_id
FROM get_diff_id
)
SELECT id, visit_date, people
FROM get_consecutive_group
WHERE group_id IN (
SELECT group_id
FROM get_consecutive_group
GROUP BY group_id
HAVING COUNT(*) >= 3
)
ORDER BY visit_date;

연속된 값을 구하는 문제다.
people이 100이 넘는 조건에서 3 이상의 연속된 id 값을 구하면 된다.
며칠 전에 비슷한 문제를 푼 적이 있어서 어렵지 않았다.
비슷한 문제> https://choddu.tistory.com/8
1. LAG 윈도우 함수로 id의 이전값을 가져와서 previous_id를 구하고
2. id와 previous_id의 차이를 구해 1 차이나면 0, 아니면 1 (그룹을 구하기 위해)로 diff_condition을 구한다.
3. 그리고 sum 윈도우 함수를 이용해 누적합을 구하면(group_id) 연속된 id끼리 그룹을 구할 수 있다.
그리고 goup_ipd로 그룹화해서 3이상인 값을 구하면 된다.

풀이2>
WITH get_consecutive_group AS (
SELECT id,
visit_date,
people,
ROW_NUMBER() OVER (ORDER BY id) AS row_num,
id - ROW_NUMBER() OVER (ORDER BY id) AS group_id
FROM Stadium
WHERE people >= 100
)
SELECT g.id,
g.visit_date,
g.people
FROM get_consecutive_group g
JOIN (
SELECT group_id
FROM get_consecutive_group
GROUP BY group_id
HAVING COUNT(*) >= 3
) valid_groups
ON g.group_id = valid_groups.group_id
ORDER BY g.visit_date;

다양한 풀이 방식이 있길래 다시 풀어봤다.
id - ROW_NUMBER() OVER (ORDER BY id)를 이용해 연속된 그룹을 구한다.
id가 증가하면 ROW_NUMBER() OVER (ORDER BY id)도 증가한다.
id의 연속성이 깨지면 위 식의 차이가 달라져 서로 다른 그룹이 만들어진다.
이게 의도된 풀이법이 아닐까 싶다. 가장 수학적 접근 방법 같다.

✅ 사용 문법 정리
ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY column_name)
: ROW_NUMBER()는 SQL의 윈도우 함수(Window Function) 중 하나로, 주어진 결과 집합에서 각 행에 순차적인 번호를 매깁니다. 주로 데이터를 특정 기준으로 정렬한 후 각 행에 고유한 번호를 부여할 때 사용됩니다.
'SQL' 카테고리의 다른 글
| [LeetCode] 3482. Analyze Organization Hierarchy (0) | 2025.03.14 |
|---|---|
| [LeetCode] 262. Trips and Users (0) | 2025.03.11 |
| [LeetCode] 3451. Find Invalid IP Addresses (0) | 2025.03.10 |
| [LeetCode] 185. Department Top Three Salaries (0) | 2025.03.10 |
| [SQL] 연습 문제 모음5 (0) | 2025.03.10 |