[LeetCode] 601. Human Traffic of Stadium

2025. 3. 12. 14:08SQL

🔗 문제 링크

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이상인 값을 구하면 된다. 

get_consecutive_group ㅌ이블

 

풀이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의 연속성이 깨지면 위 식의 차이가 달라져 서로 다른 그룹이 만들어진다.
이게 의도된 풀이법이 아닐까 싶다. 가장 수학적 접근 방법 같다.

get_consecutive_group 테이블

✅ 사용 문법 정리

ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY column_name)
: ROW_NUMBER()는 SQL의 윈도우 함수(Window Function) 중 하나로, 주어진 결과 집합에서 각 행에 순차적인 번호를 매깁니다. 주로 데이터를 특정 기준으로 정렬한 후 각 행에 고유한 번호를 부여할 때 사용됩니다.