최근 DATA가 동일 코드로 반복된 횟수를 얻으려면... ^^ 0 2 3,711

by 심원보 DECODE OVER PARTITION BY [2009.12.03 21:38:30]


안녕하세요. ^^

다름이 아니라 예로, 부서별/일자별로 특정 코드값이 반복적으로 연속해서 나온
횟수를 얻으려 합니다. 아래와 같은 경우죠.

--------------------------------------------------------------
부서명                       일자                       코드
--------------------------------------------------------------
1부서                      20091203                     3
1부서                      20091202                     3
1부서                      20091201                     3
1부서                      20091131                     2
1부서                      20091130                     3
2부서                      20091203                     3
2부서                      20091202                     3
2부서                      20091201                     1
--------------------------------------------------------------

중간에 코드 2가 되었는데 그 전까지의 3이라는 코드가 연속해서 나온 3번 이란
횟수를 부서별로 얻으려 합니다.

1부서는 3, 2부서는 2가 되면 되겠네요. 저도 고민 좀 할테니 여러분의 좋은 답변부탁드립니다. 

감사.. ^^

by 마농 [2009.12.04 08:53:27]
WITH t AS
(
SELECT '1부서' dept, '20091203' dt, 3 cd FROM dual
UNION ALL SELECT '1부서', '20091202', 3 FROM dual
UNION ALL SELECT '1부서', '20091201', 3 FROM dual
UNION ALL SELECT '1부서', '20091131', 2 FROM dual
UNION ALL SELECT '1부서', '20091130', 3 FROM dual
UNION ALL SELECT '2부서', '20091203', 3 FROM dual
UNION ALL SELECT '2부서', '20091202', 3 FROM dual
UNION ALL SELECT '2부서', '20091201', 1 FROM dual
)
SELECT dept
, COUNT(*) cnt
, MIN(dt) from_dt
, MAX(dt) to_dt
FROM
(
SELECT dept, dt, cd
, SUM(flag) OVER(PARTITION BY dept ORDER BY dt DESC) gb
FROM
(
SELECT dept, dt, cd
, DECODE(cd, LEAD(cd) OVER(PARTITION BY dept ORDER BY dt), 0, 1) flag
FROM t
)
)
WHERE gb = 1
GROUP BY dept
ORDER BY dept
;

by 심원보 [2009.12.04 09:43:32]
정말 감사... rank()나 LEAD 이것을 쓰면 되지 않을까 까지는 생각했는데 이렇게
쉽게(?) 될지는 몰랐네요. 전 아직 멀었음을 이 답변 하나로 다시 한번 느끼네요.
좋은 답변이지만 제 기분은 별로 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입