행 비교하여 출력하기 질문입니다. 0 3 576

by 빠바 [SQL Query] [2019.05.30 15:34:29]


결과값이

시간 값                               원하는 쿼리

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가 클리어 되도록 쿼리를 수정해야할 것 같은데 어떻게 하면 좋을까요?

 

by 마농 [2019.05.30 16:01:14]

원하는 설명과 결과가 다른 듯 하네요?
- 설명에서는 시간차를 구하고 싶다고 했는데
- 결과에는 시간차는 안나오네요?
원하는 결과에 대한 표현이 덜 된 듯 한데요?


by 빠바 [2019.05.30 16:07:18]

네 시간차는 첫번째 결과를 가지고 해보려 했습니다.

첫번째 결과는 마농님께서 다른분께 답변해주신 쿼리를 참고했습니다.

 

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를 하려고하는데 더 좋은 방법이 있을까요>


by 마농 [2019.05.30 17:36:56]
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
;

 

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