์ฐ์ ์์น ๊ตฌ๊ฐ์ ์กฐํํด๋ณด์.
์์ ๋ฅผ ์ํด ์๋์ ๊ฐ์ด ํ ์ด๋ธ์ ์์ฑํ์.
-- 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์ ๊ณ์ฐํ๋ฉด ์ฐ์ ์์น ๊ตฌ๊ฐ์ ์กฐํํ ์ ์๋ค.
-- 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 |