240903_TIL

J Lee·2024년 9월 3일

아무리 사소하더라도 배움이 없는 날은 없다.

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;
profile
기본기를 소홀히 하지 말자

0개의 댓글