시작시간 종료시간 중복제외 0 2 952

by 성호 [SQL Query] [2016.04.13 11:17:41]


해당과 같은 테이블이 있고 시작시간과 종료시간이 들어가 있습니다

 

  시작 종료
1 2016-04-13 8:00 2016-04-13 10:00
2 2016-04-13 9:00 2016-04-13 12:00
3 2016-04-13 13:00 2016-04-13 14:00
4 2016-04-13 14:00 2016-04-13 15:00
5 2016-04-13 17:00 2016-04-13 22:00
6 2016-04-13 20:00 2016-04-13 22:00

해당 테이블을 시간순으로 표시하면 해당과 같이 됩니다.

CASE 1 :시간이 겹침

CASE 2: 시간이 연결됨

CASE 3: 다른 시작 종료 시간안에 포함

 

  8:00 9:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00
1                              
2                              
3                              
4                              
5                              
6                              


이 테이블의 값을 최종적으로

시작 종료
2016-04-13 8:00 2016-04-13 12:00
2016-04-13 13:00 2016-04-13 15:00
2016-04-13 17:00 2016-04-13 22:00

 

이렇게 뽑아내고 싶습니다. 도와주세요

 
by jkson [2016.04.14 08:36:06]
WITH T AS
(
SELECT TO_DATE('2016-04-13 08:00:00','yyyy-mm-dd hh24:mi:ss') FROMDT
     , TO_DATE('2016-04-13 10:00:00','yyyy-mm-dd hh24:mi:ss') TODT
 FROM DUAL
UNION ALL
SELECT TO_DATE('2016-04-13 09:00:00','yyyy-mm-dd hh24:mi:ss') FROMDT
     , TO_DATE('2016-04-13 12:00:00','yyyy-mm-dd hh24:mi:ss') TODT
 FROM DUAL
UNION ALL
SELECT TO_DATE('2016-04-13 13:00:00','yyyy-mm-dd hh24:mi:ss') FROMDT
     , TO_DATE('2016-04-13 14:00:00','yyyy-mm-dd hh24:mi:ss') TODT
 FROM DUAL
UNION ALL
SELECT TO_DATE('2016-04-13 14:00:00','yyyy-mm-dd hh24:mi:ss') FROMDT
     , TO_DATE('2016-04-13 15:00:00','yyyy-mm-dd hh24:mi:ss') TODT
 FROM DUAL
UNION ALL
SELECT TO_DATE('2016-04-13 17:00:00','yyyy-mm-dd hh24:mi:ss') FROMDT
     , TO_DATE('2016-04-13 22:00:00','yyyy-mm-dd hh24:mi:ss') TODT
 FROM DUAL
UNION ALL
SELECT TO_DATE('2016-04-13 20:00:00','yyyy-mm-dd hh24:mi:ss') FROMDT
     , TO_DATE('2016-04-13 22:00:00','yyyy-mm-dd hh24:mi:ss') TODT
 FROM DUAL
UNION ALL
SELECT TO_DATE('2016-04-13 21:00:00','yyyy-mm-dd hh24:mi:ss') FROMDT
     , TO_DATE('2016-04-13 23:00:00','yyyy-mm-dd hh24:mi:ss') TODT
 FROM DUAL 
)
SELECT RN, MIN(FROMDT) FROMDT, MAX(TODT) TODT
  FROM (SELECT FROMDT, TODT
             , SUM(CASE WHEN MAXTODT >= FROMDT THEN 0 ELSE 1 END) OVER (ORDER BY FROMDT) RN
          FROM (SELECT FROMDT, TODT
                     , MAX(TODT) OVER (ORDER BY FROMDT ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) MAXTODT 
                 FROM T))
GROUP BY RN
ORDER BY RN

 


by 성호 [2016.04.14 12:10:17]

jkson님 감사합니다

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