sql 날짜 중복되지않게 변경하기!

 

저번에 업무를 하면서 날짜구간이 겹치지않게

시작날짜와 종료날짜를 변경해야하는 일이 있었어요

이게 은근..쉬울거 같으면서도 어렵더라구요

혹시 저와 같은 난관에 빠지신분들을 위해 뒤늦게 작성한 쿼리 올려볼께요^^

 

 

with t1 as(
 select 'a' usr,'2011-09-01' sdt, '2011-09-10' edt,
 '2011-09-11' sdt1 , '2011-09-28' edt1,
 '2011-09-26' sdt2, '2011-10-02' edt2,
 '2011-10-04' sdt3, '2011-10-12' edt3
 FROM dual )
,t as
(
/*select * from t1
unpivot ((sdt,edt) for dat in
((sdt,edt) as 1,
(std1, edt1) as 2,
(sdt2,edt2) as 3,
(sdt3, edt3) as 4))저는 토드 11.5g를 사용했는데 unpivot함수가 안먹더라구요

그래서 밑에처럼 노가다를 했습니다^^;

혹시나 먹히시는 분들은 위에 쿼리 사용하셔도되요~*/

select usr,sdt,edt from t1
union all select usr,sdt1 as std,edt1 as edt from t1
union all select usr,sdt2 as std,edt2 as edt from t1
union all select usr,sdt3 as std,edt3 as edt from t1
)
SELECT usr
, MIN(sdt) sdt
, MAX(edt) edt
FROM
(
SELECT usr, sdt, edt
, SUM(flag) OVER(PARTITION BY usr ORDER BY sdt, edt) grp
FROM
(
SELECT usr, sdt, edt
, CASE WHEN TO_CHAR(TO_DATE(sdt, 'yyyy-mm-dd') - 1, 'yyyy-mm-dd')
<= MAX(edt) OVER(PARTITION BY usr ORDER BY sdt, edt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
THEN 0 ELSE 1 END flag
FROM t
)
)
GROUP BY usr, grp
ORDER BY usr, grp
;

 

실행하게 되면 이런 결과가 나온답니다^^

업무에 잘 활용하시길 바랍니다.

 usr

sdt

edt

 a

2011-09-11

2011-10-02

 a

2011-10-04

2011-10-12

 

 

 

+ Recent posts