Oracle Lag Funktion mit dynamischem Parameter
Ich habe ein bestimmtes Problem. Ich habe eine Tabelle, die ungültige Werte enthält. Ich muss die ungültigen Werte ersetzen (hier0
) mit dem vorherigen Wert, der größer als @ i0
.
Die Schwierigkeit ist, dass ich kein Update oder keine Einfügung verwenden kann (Cursor und Update würden es tun). Nun, ich kann nur eine Select-Anweisung verwenden.
Wenn ich das @ benutlag(col1, 1)
- Funktion mit when case, ich bekomme nur eine Spalte mit dem korrekten Wert.
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
Inhalt vonTEST_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
Erwartetes Abfrageergebnis:
---------------------------
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