안녕하세요
이전에 질문자분이 등록한 질문을 응용해서 한번 만들어 보았습니다.그런데 답이 안나오네요. 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
쉽게 값이 나오게 할수 있을듯 합니다만, 고수님들이 조언을 부탁드립니다.
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 ;