결과값이
시간 값 원하는 쿼리
1 ISSUE 1 ISSUE
2 ISSUE 3 CLEAR
3 CLEAR 4 ISSUE
4 ISSUE 5 CLEAR
5 CLEAR 6 ISSUE
6 ISSUE 9 CLEAR
7 ISSUE 10 ISSUE
8 ISSUE 11 CLEAR
9 CLEAR
10 ISSUE
11 CLEAR
이런 식으로 결과값이 나오는 쿼리가 있습니다. ISSUE 이후에는 CLEAR가 발생하는데 CLEAR 전에 ISSUE는 두번 이상 발생 가능성이 있습니다.
이 경우 ISSUE와 CLEAR단위로 구분하여 첫 ISSUE 시간과 해당 ISSUE의 클리어시간의 차이를 구하고 싶습니다.
먼저 ISSUE가 여러개일 경우 첫 ISSUE와 해당 ISSUE가 클리어 되도록 쿼리를 수정해야할 것 같은데 어떻게 하면 좋을까요?
네 시간차는 첫번째 결과를 가지고 해보려 했습니다.
첫번째 결과는 마농님께서 다른분께 답변해주신 쿼리를 참고했습니다.
SELECT T.*
FROM (SELECT ALARMSTATE, TIMEKEY, DECODE(LAG(ALARMSTATE) OVER(ORDER BY TIMEKEY), ALARMSTATE, 0, 1) FLAG
FROM CT_MACHINEALARMHIST@ARRAY
WHERE MACHINENAME = 'A2ELA030'
AND UNITNAME = 'A2ELA031') T
WHERE T.FLAG = 1;
이런식으로 하여 원하는 결과를 출력했구요
1 ISSUE
2 CLEAR
4 ISSUE
5 CLEAR
.....
이렇게 나온 결과를 가지고 시간차를 구하려 합니다.
이때 제 생각에는 CLEAR - ISSUE 시간이기때문에
CLEAR ISSUE
2 1
5 4
이렇게 피벗을 진행 한뒤 CLEAR - ISSUE를 하려고하는데 더 좋은 방법이 있을까요>
WITH t AS ( SELECT 1 dt, 'ISSUE' v FROM dual UNION ALL SELECT 2, 'ISSUE' FROM dual UNION ALL SELECT 3, 'CLEAR' FROM dual UNION ALL SELECT 4, 'ISSUE' FROM dual UNION ALL SELECT 5, 'CLEAR' FROM dual UNION ALL SELECT 6, 'ISSUE' FROM dual UNION ALL SELECT 7, 'ISSUE' FROM dual UNION ALL SELECT 8, 'ISSUE' FROM dual UNION ALL SELECT 9, 'CLEAR' FROM dual UNION ALL SELECT 10, 'ISSUE' FROM dual UNION ALL SELECT 11, 'CLEAR' FROM dual ) SELECT MIN(DECODE(v, 'ISSUE', dt)) issue , MAX(DECODE(v, 'CLEAR', dt)) clear FROM (SELECT dt, v , SUM(flag) OVER(ORDER BY dt) grp FROM (SELECT dt, v , DECODE(LAG(v) OVER(ORDER BY dt), 'ISSUE', 0, 1) flag FROM t ) ) GROUP BY grp ORDER BY issue ;