연속 상승 구간을 조회해보자.
예제를 위해 아래와 같이 테이블을 생성하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (cd VARCHAR2(1), dt DATE , vl NUMBER); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-01' , 100); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-02' , 200); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-03' , 300); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-04' , 400); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-05' , 500); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-06' , 400); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-07' , 500); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-08' , 600); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-09' , 700); INSERT INTO t1 VALUES ( 'A' , DATE '2050-01-10' , 500); COMMIT ; |
아래와 같이 LAG 함수를 사용하여 전일대비 값인 df를 생성하고, 전체 순번과 df 별 순번의 차를 기준으로 cn을 계산하면 연속 상승 구간을 조회할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
-- 2 WITH w1 AS ( SELECT a.* , NVL (SIGN (vl - LAG (vl) OVER (PARTITION BY cd ORDER BY dt)), 0) AS df FROM t1 a) SELECT * FROM ( SELECT a.* , COUNT (*) OVER (PARTITION BY cd, rn) AS cn FROM ( SELECT a.* , ROW_NUMBER () OVER (PARTITION BY cd ORDER BY dt) - ROW_NUMBER () OVER (PARTITION BY cd, df ORDER BY dt) AS rn FROM w1 a) a WHERE df = 1) WHERE cn >= 3; CD DT VL DF RN CN -- ---------- --- -- -- -- A 2050-01-02 200 1 1 4 A 2050-01-03 300 1 1 4 A 2050-01-04 400 1 1 4 A 2050-01-05 500 1 1 4 A 2050-01-07 500 1 2 3 A 2050-01-08 600 1 2 3 A 2050-01-09 700 1 2 3 7 행이 선택되었습니다. |
'Oracle > SQL' 카테고리의 다른 글
주민등록번호 마스킹 (0) | 2012.04.30 |
---|---|
다중 행을 문자열로 집계 (0) | 2012.04.16 |
구분자 포함 값을 행으로 분리 (0) | 2012.04.13 |
연속된 공백을 하나의 공백으로 변경 (0) | 2012.04.12 |
점 이력을 선분 이력으로 전환 (0) | 2012.04.09 |