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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage