분석함수 질문드립니다. sql 0 2 1,543

by 이승재 [SQL Query] 분석함수 [2012.10.24 11:04:30]



안녕하세요

SQL 질문드립니다.


아래와 같은 표를 만들고자 하는데요

EVENTTIME,NAME,CLASS,STATUS,CONTINUECNT는 제공하는 값이고

알고자 하는 값은 CUM_CONTINUECNT 입니다.

보시면 아시겠지만, STATUS 가 FAIL/NORMAL 변경될 때 마다 CUM 은 초기화 되어 1로 바뀌구요

그이후는 누적되어 2.3.4.... 되어야 합니다.

분석함수를 써봐도 제가 아는 지식으로는 EVENTTIME,NAME,CLASS,STATUS 를 PARTITIONED BY 해서

아래처럼 결과가 나옵니다.

3
4
5
1
6
7
8

제가 원하는 결과를 산출 할 수 있게끔 도움 부탁드립니다.

EVENTTIME NAME CLASS STATUS CONTINUECNT CUM_CONTINUECNT
2012-10-23 오후 5:05:00 LEE HA1 FAIL 3 3
2012-10-23 오후 5:06:03 LEE HA1 FAIL 1 4
2012-10-23 오후 5:07:05 LEE HA1 FAIL 1 5
2012-10-23 오후 5:08:05 LEE HA1 NORMAL 1 1
2012-10-23 오후 5:09:08 LEE HA1 FAIL 1 1
2012-10-23 오후 5:10:10 LEE HA1 FAIL 1 2
2012-10-23 오후 5:11:10 LEE HA1 FAIL 1 3
2012-10-23 오후 5:12:12 LEE HA1 FAIL 1 4
2012-10-23 오후 5:13:15 LEE HA1 FAIL 1 5
2012-10-23 오후 5:14:17 LEE HA1 FAIL 1 6
2012-10-23 오후 5:15:18 LEE HA1 NORMAL 1 1
2012-10-23 오후 5:16:20 LEE HA1 NORMAL 1 2
2012-10-23 오후 5:17:21 LEE HA1 FAIL 1 1
2012-10-23 오후 5:18:23 LEE HA1 FAIL 1 2

by 마농 [2012.10.24 11:26:26]
WITH t AS
(
SELECT '20121023170500' eventtime
     , 'LEE'            name
     , 'HA1'            class
     , 'FAIL'           status
     , 3                continuecnt
  FROM dual
UNION ALL SELECT '20121023170603', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023170705', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023170805', 'LEE', 'HA1', 'NORMAL', 1 FROM dual
UNION ALL SELECT '20121023170908', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023171010', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023171110', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023171212', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023171315', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023171417', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023171518', 'LEE', 'HA1', 'NORMAL', 1 FROM dual
UNION ALL SELECT '20121023171620', 'LEE', 'HA1', 'NORMAL', 1 FROM dual
UNION ALL SELECT '20121023171721', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
UNION ALL SELECT '20121023171823', 'LEE', 'HA1', 'FAIL'  , 1 FROM dual
)
SELECT eventtime, name, class, status, continuecnt
     , SUM(continuecnt) OVER(
       PARTITION BY name, class, status, rn1-rn2
       ORDER BY eventtime
       ) cum_continuecnt
  FROM (SELECT eventtime, name, class, status, continuecnt
             , ROW_NUMBER() OVER(PARTITION BY name, class
                                     ORDER BY eventtime) rn1
             , ROW_NUMBER() OVER(PARTITION BY name, class, status
                                     ORDER BY eventtime) rn2
          FROM t
        )
 ORDER BY name, class, eventtime
;

by 이승재 [2012.10.24 11:45:38]

와우. 감사합니다.
RN1-RN2 를 묶는다는 것을 생각못했네요
RN1 하나만을가지고 처리하려고 오전 내내 고민 했습니다.
식사시간 전에 해결할 수 있어서 정말 기쁘네요
감사합니다.
또 한수 배워갑니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입