안녕하세요.
제목이 난해하죠 ;;
다름이 아니라 이런것도 쿼리로 가능할지 궁금해서요.
아래와 같은 테이블이 있다고 가정할께요.
EQP |
START_TIME (DATE 형식) | END_TIME (DATE 형식) |
A1 | 2016-05-03 06:43:30 | 2016-05-03 11:32:12 |
A2 | 2016-05-03 10:23:45 | 2016-05-03 16:33:21 |
A3 | 2016-05-03 11:10:34 | 2016-05-04 00:23:45 |
이렇게 있을 때,, GROUP BY 를 일(주,월)로 했을 때 하루 중 동시에 구동중인 EQP 의 개수가 가장 많은 값을 구하는게 쿼리로 가능할까요?
위에 표를 예를 들어 설명하면
2016-05-03 00:00:00 ~ 2016-05-03 06:43:29 : 0 대
2016-05-03 06:43:30 ~ 2016-05-03 10:23:44 : 1 대
2016-05-03 10:23:45 ~ 2016-05-03 11:10:33 : 2 대
2016-05-03 11:10:34 ~ 2016-05-03 11:32:12 : 3 대
2016-05-03 11:32:13 ~ 2016-05-03 16:33:21 : 2 대
2016-05-03 16:33:22 ~ 2016-05-03 23:59:59 : 1 대
→ 동시에 구동중인 EQP 가 가장 많은 대수는 3대임.
이렇게요. 이게 도저히 가능할지 모르겠네요 너무 어렵네요 ㅠㅠ
고수님들 부탁드립니다.~~
그럼 즐거운 밤 되세요~~
WITH t0 (eqp, start_time, end_time) AS ( SELECT 'A1', '2016-05-03 06:43:30', '2016-05-03 11:32:12' FROM dual UNION ALL SELECT 'A2', '2016-05-03 10:23:45', '2016-05-03 16:33:21' FROM dual UNION ALL SELECT 'A3', '2016-05-03 11:10:34', '2016-05-04 00:23:45' FROM dual ) , t AS ( SELECT eqp , TO_DATE(start_time, 'yyyy-mm-dd hh24:mi:ss') start_time , TO_DATE(end_time , 'yyyy-mm-dd hh24:mi:ss') end_time FROM t0 ) SELECT * FROM (SELECT start_time , LEAD(start_time) OVER(ORDER BY start_time) end_time , SUM(cnt) OVER(ORDER BY start_time) cnt FROM (SELECT DECODE(s, 1, start_time, end_time) start_time , SUM(s) cnt FROM t , (SELECT 3-LEVEL*2 s FROM dual CONNECT BY LEVEL <= 2) GROUP BY DECODE(s, 1, start_time, end_time) ) ) WHERE cnt > 0 ORDER BY start_time ;