[쿼리질문]동시가동시간을 구하고자 합니다. 0 4 836

by 초난강 [SQL Query] [2014.06.18 13:18:50]


안녕하세요

이전에 질문자분이 등록한 질문을 응용해서 한번 만들어 보았습니다.그런데 답이 안나오네요. T.T

 

EQUIPMENT STARTTIME ENDTIME DES
M 11:00 12:00 11:00 - 12:00까지가 동시가동시간
C 11:30 12:30 11:30 - 12:30까지가 동시가동시간
O 11:10 13:00 11:10 - 12:30까지가 동시가동시간
M 15:00 15:20 동시가동시간 없음
O 16:00 17:00 16:30 - 17:00까지가 동시가동시간
M 12:00 12:30 12:00 - 12:30까지가 동시가동시간
M 16:30 18:00 16:30 - 18:00까지가 동시가동시간
M 18:00 19:30 18:00 - 19:30까지가 동시가동시간
O 18:20 19:00 18:20 - 19:00까지가 동시가동시간
C 17:10 20:00 17:10 - 20:00까지가 동시가동시간
M 19:30 20:00 19:30 - 20:00까지가 동시가동시간
K 19:30 20:00 19:30 - 20:00까지가 동시가동시간
L 13:00 14:00 동시가동시간없음

11:00 M설비가동

11:10분에 O설비가동

11:30분에 C설비 가동

M설비가 11시에 시작해서  돌아가는 도중에 O설비가 시작 되었기 때문에 동시에 설비가 가동된 시간은 M설비를 기준으로하면 11:10(M), O설비를 기준으로 하면11:10(O) 그리고 M설비와 O설비가 가동중에 C설비가  11:30에 가동 되었기 때문에 C설비 기준으로 하면 11:30에 동시가동 시작시간 입니다.

M설비와 같은 경우는 동시에 가동된 시간이 11:10~~12:00

O설비와 같은 경우는 동시에 가동된 시간이 11:10~12:30

C설비와 같은 경우는 동시에 가동된 시간이 12:00~12:30

 

O설비와 같은 경우는 동시에 가동된 시간이 11:10~12:30(M설비가 11시부터 가동중이었고 C설비가 12:30분에 끝났으므로  O설비가 동시에 가동된 시간은 12:30 - 11:10 = 80분 이런식입니다만, 설명이 좀 어려운듯 합니다. T.T 

일단 어찌어찌 중복되어지는 starttime까지 뽑아내어보고자 아래와 같이 짜보았습니다만,

SELECT STARTTIME,ENDTIME,EQUIPMENT,
CASE WHEN STARTTIME BETWEEN LAG(STARTTIME)OVER (ORDER BY STARTTIME) AND LAG(ENDTIME)OVER (ORDER BY STARTTIME)
THEN
CASE WHEN LAG(STARTTIME)OVER (ORDER BY STARTTIME) LEAD(STARTTIME)OVER (ORDER BY STARTTIME)>STARTTIME
THEN STARTTIME
WHEN LAG(STARTTIME)OVER (ORDER BY STARTTIME) IS NULL
THEN LEAD(STARTTIME)OVER (ORDER BY STARTTIME)
END
ELSE
CASE WHEN LEAD(STARTTIME)OVER (ORDER BY STARTTIME) BETWEEN STARTTIME AND ENDTIME THEN
LEAD(STARTTIME)OVER (ORDER BY STARTTIME)
TO_DATE('18:18','HH24:MI')
END
END LV_STARTTIME
FROM
(SELECT EQUIPMENT,TO_DATE(STARTTIME,'HH24:MI') STARTTIME,TO_DATE(ENDTIME,'HH24:MI')ENDTIME FROM T6
ORDER BY STARTTIME,ENDTIME
)

 

가동시작시간 가동종료시간 설비 동시가동시작시간
2014/06/01 11:00:00 2014/06/01 12:00:00 M 2014/06/01 11:00:00
2014/06/01 11:00:00 2014/06/01 23:00:00 U  
2014/06/01 11:10:00 2014/06/01 13:00:00 O 2014/06/01 11:10:00
2014/06/01 11:30:00 2014/06/01 12:30:00 C 2014/06/01 11:30:00
2014/06/01 12:00:00 2014/06/01 12:30:00 M 2014/06/01 12:00:00
2014/06/01 13:00:00 2014/06/01 14:00:00 L  
2014/06/01 15:00:00 2014/06/01 15:20:00 M  
2014/06/01 16:00:00 2014/06/01 17:00:00 O 2014/06/01 16:30:00
2014/06/01 16:30:00 2014/06/01 18:00:00 M 2014/06/01 16:30:00
2014/06/01 17:10:00 2014/06/01 20:00:00 C 2014/06/01 17:10:00
2014/06/01 18:00:00 2014/06/01 19:30:00 M 2014/06/01 18:00:00
2014/06/01 18:20:00 2014/06/01 19:00:00 O 2014/06/01 18:20:00
2014/06/01 19:30:00 2014/06/01 20:00:00 M 2014/06/01 19:30:00
2014/06/01 19:30:00 2014/06/01 20:00:00 K  

틀린테이터가 나옵니다. T.T

쉽게 값이 나오게 할수 있을듯 합니다만, 고수님들이 조언을 부탁드립니다.

by 마농 [2014.06.18 13:23:48]

원하는 결과데이터에 대한 설명을 해주세요.

자료 정비를 해주세요. 앞뒤가 안맞는듯 합니다.


by 초난강 [2014.06.18 14:27:27]

질문자체가  잘못되었을수도 있습니다만...

질문 내용을 수정하였습니다.


by 마농 [2014.06.18 15:34:20]
WITH t AS
(
SELECT 'M' equipment, '11:00' starttime, '12:00' endtime FROM dual
UNION ALL SELECT 'C', '11:30', '12:30' FROM dual
UNION ALL SELECT 'O', '11:10', '13:00' FROM dual
UNION ALL SELECT 'M', '15:00', '15:20' FROM dual
UNION ALL SELECT 'O', '16:00', '17:00' FROM dual
UNION ALL SELECT 'M', '12:00', '12:30' FROM dual
UNION ALL SELECT 'M', '16:30', '18:00' FROM dual
UNION ALL SELECT 'M', '18:00', '19:30' FROM dual
UNION ALL SELECT 'O', '18:20', '19:00' FROM dual
UNION ALL SELECT 'C', '17:10', '20:00' FROM dual
UNION ALL SELECT 'M', '19:30', '20:00' FROM dual
UNION ALL SELECT 'K', '19:30', '20:00' FROM dual
UNION ALL SELECT 'L', '13:00', '14:00' FROM dual
)
SELECT equipment, starttime, endtime
     , LISTAGG(stm||'~'||etm, ',') WITHIN GROUP(ORDER BY grp) tm
  FROM (SELECT equipment, starttime, endtime
             , grp
             , MIN(stm) stm
             , MAX(etm) etm
          FROM (SELECT equipment, starttime, endtime
                     , stm, etm
                     , SUM(flag) OVER(PARTITION BY equipment, starttime ORDER BY stm) grp
                  FROM (SELECT a.equipment, a.starttime, a.endtime
                             , b.stm, b.etm
                             , DECODE(LAG(etm)
                                      OVER(PARTITION BY equipment, starttime ORDER BY stm)
                                      , stm, 0, 1) flag
                          FROM t a
                             , (SELECT stm
                                     , LEAD(stm) OVER(ORDER BY stm) etm
                                     , SUM(cnt) OVER(ORDER BY stm) cnt
                                  FROM (SELECT DECODE(s, 1, starttime, endtime) stm
                                             , SUM(s) cnt
                                          FROM t
                                             , (SELECT 3-LEVEL*2 s
                                                  FROM dual CONNECT BY LEVEL <= 2)
                                         GROUP BY DECODE(s, 1, starttime, endtime)
                                        )
                                ) b
                         WHERE b.stm(+) >= a.starttime
                           AND b.etm(+) <= a.endtime
                           AND b.cnt(+) > 1
                        )
                )
         GROUP BY equipment, starttime, endtime, grp
        )
 GROUP BY equipment, starttime, endtime
 ORDER BY starttime
;

 


by 초난강 [2014.06.18 16:13:17]

쿼리 유용하게 잘 쓰겠습니다. 감사합니다.

항상  마농님의 쿼리를 공부하며 배우고 있습니다. 감사합니다. T.T

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