안녕하세요 궁금한게 있어 글 남깁니다.
프로시저를 쓰지 않고 아래의 엑셀 로직을 만드는 SELECT쿼리를 짤수 있을까요?
LAG를 쓰면 간단하게 될거다 생각했는데 막상 짜보니 잘안되네요
도움주시면 너무 감사하겠습니다 .
| A | B | C (C0 = 0) | |
| 1 | 1 | 2 | 2 |
| 2 | 3 | 4 | C1 * B2 = 2*4 |
| 3 | 5 | 6 | C2 * B3 = 2*4 * 6 |
WITH t AS
(
SELECT 1 a, 2 b FROM dual
UNION ALL SELECT 3, 4 FROM dual
UNION ALL SELECT 5, 6 FROM dual
)
-- 1. 분석함수 와 수학공식 이용(누적곱) --
SELECT ROW_NUMBER() OVER(ORDER BY a) rn
, a
, b
, ROUND(EXP(SUM(LN(b)) OVER(ORDER BY a))) c
FROM t
;
WITH t AS
(
SELECT 1 a, 2 b FROM dual
UNION ALL SELECT 3, 4 FROM dual
UNION ALL SELECT 5, 6 FROM dual
)
-- 2. Recursive 쿼리 이용(누적곱) --
, t1 AS
(
SELECT ROW_NUMBER() OVER(ORDER BY a) rn
, a, b
FROM t
)
, t2(rn, a, b, c) AS
(
SELECT rn
, a
, b
, b c
FROM t1
WHERE rn = 1
UNION ALL
SELECT b.rn
, b.a
, b.b
, a.c * b.b
FROM t2 a
, t1 b
WHERE b.rn = a.rn + 1
)
SELECT *
FROM t2
;
WITH t AS ( SELECT 1 a, 2 b FROM dual UNION ALL SELECT 3, 4 FROM dual UNION ALL SELECT 5, 6 FROM dual ) -- 3. Model 절 이용 SELECT * FROM t MODEL DIMENSION BY (ROW_NUMBER() OVER(ORDER BY a) rn) MEASURES (a, b, b c) RULES (c[rn > 1] = c[cv()-1] * b[cv()]) ;
너무너무 고맙습니다