중복되는 기간을 제외하고 구하려고 합니다. 1 2 521

by 날치2 [2020.09.19 11:50:29]


우선순위 1에 겹치지 않는 우선순위 2의 구간을 결과로 검색하고 싶은데

잘 안떠올라서 고수분들께 여쭤봅니다.

테이블

시작일시 종료일시 우선순위
2020-09-01 08시 10분 2020-09-01 08시 20분 1
2020-09-01 08시 40분 2020-09-01 08시 55분 1
2020-09-01 08시 15분 2020-09-01 08시 50분 2

select '202009010810' as 시작일시, '202009010820' as 종료일시, 1 as 우선순위 from dual union all

select '202009010840' as 시작일시, '202009010855' as 종료일시, 1 as 우선순위 from dual union all

select '202009010815' as 시작일시, '202009010850' as 종료일시, 2 as 우선순위 from dual

우선순위 1에 포함되지 않는 우선순위 2의 시간을 구해야함.

 

결과

시작일시 종료일시
2020-09-01 08시 15분 2020-09-01 08시 40분

 

그림으로는 이런식으로 우선순위 2가 우선순위 1에 겹치지 않는

칠한 부분을 찾아보려는데요...잘 안되네요. ㅜㅜ;;

by 마농 [2020.09.21 13:36:43]
WITH t AS
(
SELECT '202009010810' sdt, '202009010820' edt, 1 seq FROM dual
UNION ALL SELECT '202009010840', '202009010855', 1 FROM dual
UNION ALL SELECT '202009010815', '202009010850', 2 FROM dual
)
SELECT sdt
     , edt
  FROM (SELECT dt sdt
             , LEAD(dt) OVER(ORDER BY dt) edt
             , SUM(SUM(s)) OVER(ORDER BY dt) s
          FROM (SELECT DECODE(lv, 1, sdt, edt) dt
                     , DECODE(lv, seq, -1, 1) s 
                  FROM t
                     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2)
                )
         GROUP BY dt
        )
 WHERE s > 0
;

 


by 날치2 [2020.09.21 15:32:06]

아~ 이렇게 하니깐 답이나오네요 ;;

그리구, 결과가 08시 20분 ~ 08시 40분 이군요. 제가 잘못 적었네요. 

주말동안의 고민이 한방에 해결되었습니다. 꾸벅~

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