날짜 중첩 제외 쿼리~ 좀 봐주세요. 1 4 1,066

by 산달 [SQL Query] [2015.06.23 08:44:00]


질의내용: 날짜 구간별에서 중첩되는 날짜는 제외

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

위와 같은 쿼리는 어떤 방식으로 추출해야 하는지 고수님들의 고견을 부탁드립니다.

by DarkBee [2015.06.23 11:45:42]

2014년이 맞는듯 하네요 ^_^;


by DarkBee [2015.06.23 11:47:36]

조금더 생각을 해봐야되는게

 

1번이 1980.01.01 부터 2015.12.31일 까지이면

 

2 / 3 / 4 / 5 번 빠지고 1번만 나와야 되는지...?


by 창조의날개 [2015.06.23 12:07:01]
-- 제가 문제를 잘 못 이해 햇네요..

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
;

 


by 마농 [2015.06.24 09:14:35]
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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입