2017-07-03 1 views
1

Ich habe eine Zeitreihe mit Nullwerten. Ich möchte jeden Null-Wert durch den letzten Nicht-Nicht-Wert ersetzen. Nach dem, was ich recherchiert habe, kann Oracle SQL dies leicht mit Last_value mit IGNORE NULLS erreichen. Gibt es einen ähnlichen Weg, dies mit SQL Server 2016 zu erreichen? Sonst werde ich es nur mit C# programmieren, aber ich fühlte, dass die Verwendung von SQL schneller, sauberer und einfacher wäre.Last_value mit IGNORE NULLS in SQL Server

Sec SCORE 
1 Null 
2 Null 
3 5 
4 Null 
5 8 
6 7 
7 Null 

Sollte ersetzt werden durch:

Sec SCORE 
1 Null 
2 Null 
3 5 
4 5 
5 8 
6 7 
7 7 
+1

Mögliches Duplikat von [So erhalten Sie den vorherigen Wert für Nullwerte] (https://stackoverflow.com/questions/16669620/how-to-get-previous-value-for-null-values) –

Antwort

2

Sie dies mit zwei kumulativen Operationen ausführen können:

select t.*, 
     coalesce(score, max(score) over (partition by id)) as newscore 
from (select t.*, 
      max(case when score is not null then id end) over (order by id) as maxid 
     from t 
    ) t; 

Die innerste Unterabfrage wird die letzte ID, wo ein Wert vorhanden ist. Der äußerste "spreizt" diesen Wert in die nachfolgenden Zeilen.

Wenn Sie die Tabelle tatsächlich aktualisieren möchten, können Sie dies einfach in eine update integrieren. Aber, Oracle kann das nicht (einfach), also denke ich, dass das nicht notwendig ist.

+0

Genius! Genau das, was ich brauche. Ich plane dies jedoch oft und in Millionen von Zeilen. Es dauerte ungefähr 1 Minute, um das oben genannte auf 3 Millionen Aufzeichnungen zu machen. Würde ich signifikante Geschwindigkeitsvorteile erhalten, wenn ich zu Oracle Express wechselte und last_value mit IGNORE NULLS verwendete? –

+0

@TrevorD. . . Das müsstest du selbst testen. Natürlich dauert das Ausführen von zwei Fensterfunktionen länger als das Ausführen von einem; Ich bin mir nicht sicher, ob es sich lohnt, Datenbanken für diesen Vorteil zu wechseln. –