반응형
동적 매개변수를 사용한 Oracle Lag 함수
저는 특정한 문제가 있습니다.유효하지 않은 값이 포함된 표가 있습니다.잘못된 값을 교체해야 합니다(여기).0)보다 큰 이전 값으로0.
문제는 업데이트나 삽입기를 사용하는 것이 적절치 않다는 것입니다(커서와 업데이트가 이를 수행합니다).저의 유일한 방법은 Select 문을 사용하는 것입니다.
사용할 때.lag(col1, 1)- when case의 함수, 나는 정확한 값의 열을 하나만 얻습니다.
select col1, col2 realcol2,
(case
when col2 = 0 then
lag(col2,1,1) over (partition by col1 order by col1 )
else
col2
end ) col2,
col3 realcol3,
(case
when col3 = 0 then
lag(col3,1,1) over (partition by col1 order by col1 )
else
col3
end ) col3
from test_table
내용TEST_TABLE:
---------------------------
Col1 | Col2 | Col3 | Col4
---------------------------
A | 0 | 1 | 5
B | 0 | 4 | 0
C | 2 | 0 | 0
D | 0 | 0 | 0
E | 3 | 5 | 0
F | 0 | 3 | 0
G | 0 | 3 | 1
A | 0 | 1 | 5
E | 3 | 5 | 0
예상 쿼리 결과:
---------------------------
Col1 | Col2 | Col3 | Col4
---------------------------
A | 0 | 1 | 5
B | 0 | 4 | 5
C | 2 | 4 | 5
D | 2 | 4 | 5
E | 3 | 5 | 5
F | 3 | 3 | 5
G | 3 | 3 | 1
A | 3 | 1 | 5
E | 3 | 5 | 5
추가적인 열이 있다고 가정하고 있습니다.col0당신의 데이터에 대한 명백한 주문 기준을 포함하고 있습니다.col1예제 데이터가 실제로 올바르게 정렬되지 않았습니다(repeated, 후행 값:A그리고.E).
너무 좋아요.MODEL이런 종류의 목적을 위한 조항.다음 쿼리는 예상 결과를 제공합니다.
WITH t(col0, col1, col2, col3, col4) AS (
SELECT 1, 'A', 0, 1, 5 FROM DUAL UNION ALL
SELECT 2, 'B', 0, 4, 0 FROM DUAL UNION ALL
SELECT 3, 'C', 2, 0, 0 FROM DUAL UNION ALL
SELECT 4, 'D', 0, 0, 0 FROM DUAL UNION ALL
SELECT 5, 'E', 3, 5, 0 FROM DUAL UNION ALL
SELECT 6, 'F', 0, 3, 0 FROM DUAL UNION ALL
SELECT 7, 'G', 0, 3, 1 FROM DUAL UNION ALL
SELECT 8, 'A', 0, 1, 5 FROM DUAL UNION ALL
SELECT 9, 'E', 3, 5, 0 FROM DUAL
)
SELECT * FROM t
MODEL
DIMENSION BY (row_number() OVER (ORDER BY col0) rn)
MEASURES (col1, col2, col3, col4)
RULES (
col2[any] = DECODE(col2[cv(rn)], 0, NVL(col2[cv(rn) - 1], 0), col2[cv(rn)]),
col3[any] = DECODE(col3[cv(rn)], 0, NVL(col3[cv(rn) - 1], 0), col3[cv(rn)]),
col4[any] = DECODE(col4[cv(rn)], 0, NVL(col4[cv(rn) - 1], 0), col4[cv(rn)])
)
결과:
RN COL1 COL2 COL3 COL4
1 A 0 1 5
2 B 0 4 5
3 C 2 4 5
4 D 2 4 5
5 E 3 5 5
6 F 3 3 5
7 G 3 3 1
8 A 3 1 5
9 E 3 5 5
MODEL 조항 vs window function-based approachs에 대한 참고
위의 내용이 보기에 멋지거나(또는 사용자의 관점에 따라 무섭기도 하지만, nop77svk(사용) 또는 MT0(사용)에 의해 다른 우아한 답변에 의해 노출되는 창 기능 기반의 감정 기법을 사용하는 것을 선호해야 합니다.저는 이 블로그 게시물에서 이 답변들을 더 자세히 설명했습니다.
원래 데이터 순서에 따라 이전 값을 원하는 경우 쿼리는 다음과 같이 표시될 수 있습니다.
with preserve_the_order$ as (
select X.*,
rownum as original_order$
from test_table X
)
select X.col1,
nvl(last_value(case when col2 > 0 then col2 end) ignore nulls over (order by original_order$ rows between unbounded preceding and current row), col2) as col2,
nvl(last_value(case when col3 > 0 then col3 end) ignore nulls over (order by original_order$ rows between unbounded preceding and current row), col3) as col3,
nvl(last_value(case when col4 > 0 then col4 end) ignore nulls over (order by original_order$ rows between unbounded preceding and current row), col4) as col4
from preserve_the_order$ X
order by original_order$
;
결과:
COL1 COL2 COL3 COL4
---- ---------- ---------- ----------
A 0 1 5
B 0 4 5
C 2 4 5
D 2 4 5
E 3 5 5
F 3 3 5
G 3 3 1
A 0 1 5
E 3 5 5
SELECT col1,
CASE col2 WHEN 0 THEN NVL( LAG( CASE col2 WHEN 0 THEN NULL ELSE col2 END ) IGNORE NULLS OVER ( ORDER BY NULL ), 0 ) ELSE col2 END AS col2,
CASE col3 WHEN 0 THEN NVL( LAG( CASE col3 WHEN 0 THEN NULL ELSE col3 END ) IGNORE NULLS OVER ( ORDER BY NULL ), 0 ) ELSE col3 END AS col3,
CASE col4 WHEN 0 THEN NVL( LAG( CASE col4 WHEN 0 THEN NULL ELSE col4 END ) IGNORE NULLS OVER ( ORDER BY NULL ), 0 ) ELSE col4 END AS col4
FROM table_name;
결과:
COL1 COL2 COL3 COL4
---- ---------- ---------- ----------
A 0 1 5
B 0 4 5
C 2 4 5
D 2 4 5
E 3 5 5
F 3 3 5
G 3 3 1
A 3 1 5
E 3 5 5
언급URL : https://stackoverflow.com/questions/34160574/oracle-lag-function-with-dynamic-parameter
반응형
'programing' 카테고리의 다른 글
| Excel VBA: 배열 변수의 변형 (0) | 2023.09.28 |
|---|---|
| 32비트 cmd.exe에서 64비트 파워셸을 시작하는 방법은? (0) | 2023.09.28 |
| jQuery를 사용하여 원소의 위쪽에서 px로 수직 거리를 찾는 방법 (0) | 2023.09.28 |
| Sequelize User M2M Group - 그룹에 속한 사용자 찾기 (0) | 2023.09.28 |
| CSS에서 if/else 조건을 사용할 수 있습니까? (0) | 2023.09.23 |