SQL 코드카타
문제 링크
풀다가 도저히 안 풀려서 다른 사람들의 풀이를 참고했다.
이런 발상을 어떻게 하는건지 대단하다 싶을 정도.
전에도 이렇게 window 함수를 써서
구분의 기준이 되는 열을 만들어서 풀었던 문제가 있었던 걸로 기억하는데,
나중에 찾게 되면 꼭 따로 정리해 놔야겠다.
블로그에 글을 쓰는 건 위키 방식이 아니라서 이럴 때 불편하구만.
WITH a
AS (SELECT hall_id,
start_day,
end_day,
Max(end_day)
OVER(
partition BY hall_id
ORDER BY start_day) AS "temp"
FROM hallevents),
b
AS (SELECT hall_id,
start_day,
end_day,
CASE
WHEN start_day <= Lag(temp, 1, 0)
OVER(
partition BY hall_id
ORDER BY start_day) THEN 0
ELSE 1
END AS "range_start"
FROM a),
c
AS (SELECT hall_id,
start_day,
end_day,
range_start,
Sum(range_start)
OVER(
partition BY hall_id
ORDER BY start_day) AS "sum_range"
FROM b)
SELECT hall_id,
Min(start_day) AS "start_day",
Max(end_day) AS "end_day"
FROM c
GROUP BY hall_id,
sum_range;