닌자고양이
[SQL] 그룹 관계 없이 값의 연속성에 의한 Partitioning 본문
DAYS HOLYDAY_YN HOLYDAY_STR
2017-01-01 1 1
2017-01-02 0 0
2017-01-03 0 0
2017-01-22 1 1
2017-01-23 1 2
2017-01-24 0 0
2017-01-25 0 0
2017-01-26 0 0
2017-01-27 1 1
2017-01-28 1 2
2017-01-29 1 3
2017-01-30 1 4
1은 휴일, 0은 평일을 뜻하는데, 당일이 몇일 연속 휴일인지 알아내는 문제이다.
0 과 1 두가지 만으로 구성된 데이터를 연속성만으로 증분 그룹핑하기가 의외로 까다롭다.
SELECT DAYS, HOLYDAY_YN, HOLYDAY_YN * RANK() OVER (PARTITION BY d ORDER BY DAYS) HOLYDAY_STR
FROM
(
SELECT *, MAX(CASE WHEN prev = 0 THEN DAYS END) OVER (ORDER BY DAYS) d
FROM
(SELECT *, LAG(HOLYDAY_YN) OVER(ORDER BY DAYS) prev
FROM DATELIST
)A
)A
'기타 코드' 카테고리의 다른 글
[SQL] WITH 절 (CTE: Common Table Expressions) (0) | 2021.03.07 |
---|---|
[SQL] PIVOT 과 UNPIVOT (0) | 2020.02.12 |
[SQL] STRING_AGG 대용 (0) | 2020.02.08 |
[SQL] N개 행 생성하기 (0) | 2020.02.07 |
Comments