2017-04-19 4 views
0

Ich habe ein wenig toruble mit dem Ausfüllen einiger Werte in SQL. Hier ist ein Beispiel für die Art und Weise, wie meine Daten strukturiert sind.Füllen Sie den Wert auf ein bestimmtes Datum nach Gruppe

ID Date Value EndDate 
A 1/1/17 500 6/1/17 
A 2/1/17 489 6/1/17 
A 3/1/17 480 6/1/17 
A 4/1/17 475 6/1/17 
A 5/1/17 460 6/1/17 
A 6/1/17 0  6/1/17 
A 7/1/17 0  6/1/17 
B 4/1/17 784 8/1/17 
B 5/1/17 801 8/1/17 
B 6/1/17 0  8/1/17 
B 7/1/17 0  8/1/17 
B 8/1/17 0  8/1/17 
B 9/1/17 0  8/1/17 
B 10/1/17 0  8/1/17 
C 2/1/17 980 7/1/17 
C 3/1/17 564 7/1/17 
C 4/1/17 647 7/1/17 
C 5/1/17 500 7/1/17 
C 6/1/17 0  7/1/17 
C 7/1/17 0  7/1/17 
C 8/1/17 0  7/1/17 

Für jede Gruppe möchte ich die Wertspalte bis zu dem Punkt ausfüllen, an dem das Datum EndDate entspricht. Die gewünschte Ausgabe würde so aussehen:

ID Date Value EndDate 
A 1/1/17 500 6/1/17 
A 2/1/17 489 6/1/17 
A 3/1/17 480 6/1/17 
A 4/1/17 475 6/1/17 
A 5/1/17 460 6/1/17 
A 6/1/17 460 6/1/17 
A 7/1/17 0  6/1/17 
B 4/1/17 784 8/1/17 
B 5/1/17 801 8/1/17 
B 6/1/17 801 8/1/17 
B 7/1/17 801 8/1/17 
B 8/1/17 801 8/1/17 
B 9/1/17 0  8/1/17 
B 10/1/17 0  8/1/17 
C 2/1/17 980 7/1/17 
C 3/1/17 564 7/1/17 
C 4/1/17 647 7/1/17 
C 5/1/17 500 7/1/17 
C 6/1/17 500 7/1/17 
C 7/1/17 500 7/1/17 
C 8/1/17 0  7/1/17 

Irgendwelche Vorschläge? Vielen Dank!

+0

'Fall, wenn Datum <= EndDate dann Wert else 0 Ende als Wert' – xQbert

+0

HI xQbert. Ich brauche speziell den letzten Wert ungleich null, der ausgefüllt werden soll, wenn die Ergebnismenge nach ID und Datum geordnet ist. Berücksichtigt das die Reihenfolge? –

+0

Oh 1 sek. Ich sehe jetzt, dass wir den vorherigen Wert weiterleiten, aber nur wenn das Datum <= Enddatum ist. Ich dachte, Wert enthält den gewünschten Wert. – xQbert

Antwort

2

begegnen Sie benötigen einen LAST_VALUE -basierte Logik wie folgt anzuwenden: Änderung Nullen auf NULL, wenn Datum < = EndDate und suchen Sie dann nach dem letzten vorhandenen Wert

Last_Value(CASE 
      WHEN Date <= EndDate 
      THEN NullIf(Value,0) 
      ELSE Value 
      END IGNORE NULLS) 
Over (PARTITION BY ID 
     ORDER BY Date) 
+0

Noch nicht vollständig getestet, aber an diesem Punkt sieht alles gut aus! –

+0

NullIfZero? :-) –

+0

@DuduMarkovitz: Nein, weil es proprietäre Syntax ist und 'NullIf (Value, 0) 'ist kürzer als' NullIfZero (Value) ':-) – dnoeth

0

Normalerweise würde ich Lag() analytisch, aber ich glaube nicht, Teradata unterstützt es so ..

SELECT Id 
    , Date 
    , Case when Date<=EndDate then Lag(Value) over (order by ID, EndDate) 
      else 0 end as value 
    , EndDate 
FROM Table 

... vielleicht ... basierend auf Teradata equivalent for lead and lag function of oracle

SELECT Id 
    , Date 
    , Case when Date<=EndDate then coalesce(MAX(Value) 
      over (Partition by 1 order by ID, EndDate ROWS BETWEEN 1 PRECEDING and 1 PRECEDING),0) 
      else 0 end as value 
    , EndDate 
FROM Table 

Ich habe kein Testbett für Teradata, also müssen Sie uns wissen lassen, ob es funktioniert. oder welche Fehler Sie

+0

Überprüfen Sie dies jetzt. Vielen Dank! –

+0

der zweite kann einige falsche Positive aufgrund der Coalese bekommen, aber ich war mir nicht sicher, wie Sie mit Situationen umgehen wollten, wenn vorhergehender Wert nicht existierte .... – xQbert

Verwandte Themen