질의내용: 날짜 구간별에서 중첩되는 날짜는 제외
no frdt todt
1. 1984.09.01 ~ 1988.07.01
2. 1988.09.01 ~ 1990.06.30
3. 1990.07.01 ~ 2002.03.31
4. 2003.03.01 ~ 2014.03.31
5. 2005.02.01 ~ 2014.03.31
결과,
1번의 종료일자와 2번의 시작일자가 연속이 아님으로
1. 1984.09.01 ~ 1988.07.01
2번의 종료일자와 3번의 시작일자가 연속, 3번의 종료일자와 4번의 시작일자가 연속이 아님으로
2. 1988.09.01 ~ 2002.03.31
4번의 종료일자와 5번의 시작일자가 연속이 아님으로
4. 2003.03.01 ~ 2014.03.31
5번은 4번에 모두 포함됨으로 제외됨
최종결과는
1. 1984.09.01 ~ 1988.07.01
2. 1988.09.01 ~ 2002.03.31
4. 2003.03.01 ~ 2014.03.31
위와 같은 쿼리는 어떤 방식으로 추출해야 하는지 고수님들의 고견을 부탁드립니다.
-- 제가 문제를 잘 못 이해 햇네요.. WITH TT(NO,FRDT,TODT) AS( SELECT 1, '1984.09.01', '1988.07.01' FROM DUAL UNION ALL SELECT 2, '1988.09.01', '1990.06.30' FROM DUAL UNION ALL SELECT 3, '1990.07.01', '2002.03.31' FROM DUAL UNION ALL SELECT 4, '2003.03.01', '2014.03.31' FROM DUAL UNION ALL SELECT 5, '2005.02.01', '2014.03.31' FROM DUAL ) SELECT MIN(NO) NO, TO_CHAR(MIN(DD),'YYYY.MM.DD') FRDT, TO_CHAR(MAX(DD),'YYYY.MM.DD') TODT FROM (SELECT NO,FRDT , CASE WHEN TODT >= TO_CHAR(TO_DATE(LEAD(FRDT) OVER(ORDER BY FRDT),'YYYY.MM.DD')-1,'YYYY.MM.DD') THEN TO_CHAR(TO_DATE(LEAD(FRDT) OVER(ORDER BY FRDT),'YYYY.MM.DD')-1,'YYYY.MM.DD') ELSE TODT END AS TODT FROM TT) TT , (SELECT (SELECT TO_DATE(MIN(FRDT),'YYYY.MM.DD') FROM TT) + ROWNUM -1 AS DD FROM DUAL CONNECT BY LEVEL <= (SELECT TO_DATE(MAX(TODT),'YYYY.MM.DD') - TO_DATE(MIN(FRDT),'YYYY.MM.DD') FROM TT) + 1 ) WHERE DD BETWEEN TO_DATE(FRDT,'YYYY.MM.DD') AND TO_DATE(TODT,'YYYY.MM.DD') GROUP BY DD-ROWNUM ORDER BY 1 ;
WITH t AS ( SELECT 1 no, '19840901' frdt, '19880701' todt FROM dual UNION ALL SELECT 2, '19880901', '19900630' FROM dual UNION ALL SELECT 3, '19900701', '20020331' FROM dual UNION ALL SELECT 4, '20030301', '20140331' FROM dual UNION ALL SELECT 5, '20050201', '20140331' FROM dual ) SELECT MIN(frdt) frdt , MAX(todt) todt FROM (SELECT no, frdt, todt , SUM(flag) OVER(ORDER BY frdt, todt, no) grp FROM (SELECT no, frdt, todt , CASE WHEN MAX(todt) OVER(ORDER BY frdt, todt, no ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) >= TO_CHAR(TO_DATE(frdt, 'yyyymmdd') - 1, 'yyyymmdd') THEN 0 ELSE 1 END flag FROM t ) ) GROUP BY grp ORDER BY grp ;