with AA as
(select '20200601' as start_dt, '20200601' as aply_dt, 2749 as cnt, 1 as work_type
from dual
union all
select '20200602' as start_dt, '20200602' as aply_dt, 3342as cnt, 1 as work_type
from dual
union all
select '20200603' as start_dt, '20200603' as aply_dt, 5434 as cnt, 0 as work_type
from dual
union all
select '20200604' as start_dt, '20200604' as aply_dt, 3445 as cnt, 0 as work_type
from dual
union all
select '20200605' as start_dt, '20200605' as aply_dt, 2322 as cnt, 1 as work_type
from dual
union all
select '20200606' as start_dt, '20200606' as aply_dt, 4324 as cnt, 1 as work_type
from dual
union all
select '20200607' as start_dt, '20200607' as aply_dt, 3336 as cnt, 2 as work_type
from dual
union all
select '20200608' as start_dt, '20200608' as aply_dt, 4543 as cnt, 0 as work_type
from dual
union all
select '20200609' as start_dt, '20200609' as aply_dt, 1233 as cnt, 1 as work_type
from dual
union all
select '20200610' as start_dt, '20200610' as insr_end_dt, 3232 as cnt, 1 as work_type
from dual
)
select * from AA;
/*
결과
START_DT | APLY_DT | CNT |
20200601 | 20200601 | 2749 |
20200602 | 20200602 | 3342 |
20200605 | 20200603/20200604/20200605 | 5434+3445+2322 |
20200606 | 20200606 | 4324 |
20200609 | 20200607/20200608/20200609 | 3336+4543+1233 |
20200610 | 20200610 | 3232 |
work_type = 1이 아닌경우 다음날짜의 work_type값이 1이 나올때까지 모두 그룹화해서 보일수있게끔 하고싶습니다.
혹시 이게 가능할까요? 제지식으로는 찾기가힘들어서요..
(참고 : work_type =1(평일), 0,2(휴일) )
*/
with AA as (select '20200601' as start_dt, '20200601' as aply_dt, 2749 as cnt, 1 as work_type from dual union all select '20200602' as start_dt, '20200602' as aply_dt, 3342as cnt, 1 as work_type from dual union all select '20200603' as start_dt, '20200603' as aply_dt, 5434 as cnt, 0 as work_type from dual union all select '20200604' as start_dt, '20200604' as aply_dt, 3445 as cnt, 0 as work_type from dual union all select '20200605' as start_dt, '20200605' as aply_dt, 2322 as cnt, 1 as work_type from dual union all select '20200606' as start_dt, '20200606' as aply_dt, 4324 as cnt, 1 as work_type from dual union all select '20200607' as start_dt, '20200607' as aply_dt, 3336 as cnt, 2 as work_type from dual union all select '20200608' as start_dt, '20200608' as aply_dt, 4543 as cnt, 0 as work_type from dual union all select '20200609' as start_dt, '20200609' as aply_dt, 1233 as cnt, 1 as work_type from dual union all select '20200610' as start_dt, '20200610' as insr_end_dt, 3232 as cnt, 1 as work_type from dual ) SELECT MAX(START_DT) START_DT , LISTAGG(APLY_DT, '/') WITHIN GROUP (ORDER BY APLY_DT) AS APLY_DT , LISTAGG(CNT, '+') WITHIN GROUP (ORDER BY APLY_DT) AS CNT FROM ( SELECT A.* , LAST_VALUE(GRP) IGNORE NULLS OVER(ORDER BY START_DT DESC) GB FROM ( SELECT AA.* , START_DT - CASE WHEN WORK_TYPE = 1 THEN 0 END GRP FROM AA ) A ) GROUP BY GB
WITH aa AS ( SELECT '20200601' start_dt, '20200601' aply_dt, 2749 cnt, 1 work_type FROM dual UNION ALL SELECT '20200602', '20200602', 3342, 1 FROM dual UNION ALL SELECT '20200603', '20200603', 5434, 0 FROM dual UNION ALL SELECT '20200604', '20200604', 3445, 0 FROM dual UNION ALL SELECT '20200605', '20200605', 2322, 1 FROM dual UNION ALL SELECT '20200606', '20200606', 4324, 1 FROM dual UNION ALL SELECT '20200607', '20200607', 3336, 2 FROM dual UNION ALL SELECT '20200608', '20200608', 4543, 0 FROM dual UNION ALL SELECT '20200609', '20200609', 1233, 1 FROM dual UNION ALL SELECT '20200610', '20200610', 3232, 1 FROM dual ) SELECT MAX(start_dt) start_dt , LISTAGG(aply_dt, '/') WITHIN GROUP(ORDER BY aply_dt) aply_dt , SUM(cnt) cnt FROM (SELECT start_dt, aply_dt, cnt, work_type , COUNT(DECODE(work_type, 1, 1)) OVER(ORDER BY start_dt, aply_dt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) gb FROM aa ) GROUP BY gb ;