2017-06-05 1 views
3

Ich versuche eine einfache Teilmenge, aber habe ein wenig Probleme mit der gleichzeitige Anwendung meiner beiden Bedingungen. Ich suche für jede eindeutige ID den letzten Datensatz, in dem die Wertspalte erhöht wurde. Zum Beispiel, hier ist eine vereinfachte Version meiner Daten.Wählen Sie die letzte Wertsteigerung Spalte nach ID

ID| Date | Value 
A 1/1/17 100 
A 1/2/17 185 
A 1/3/17 40 
A 1/4/17 100 
A 1/5/17 30 
B 1/3/17 40 
B 1/4/17 30 
B 1/5/17 65 
B 1/6/17 80 
B 1/7/17 0 
B 1/8/17 0 

Während meine gewünschte Ausgabe der Reihe sein würde, wo die letzte Erhöhung des Wertes Platz für jede ID nahm

ID| Date | Value 
A 1/4/17 100 
A 1/6/17 80 

Hat jemand einen Einblick darüber, wie ich meine gewünschte Ausgabe erreichen kann? Vielen Dank.

Antwort

0

Zwei Schritte:

select t.* 
from (select t.*, 
      row_number() over (partition by id order by date desc) as seqnum 
     from (select t.*, 
        max(value) over (partition by id order by date rows between 1 preceding and 1 preceding) as prev_value 
      from t 
      ) t 
     where prev_value < value 
    ) t 
where seqnum = 1; 

In Teradata können Sie auch qualify verwenden eine Ebene von Unterabfragen zu entfernen.

+1

ich glaube nicht, dass Sie "Verzögerung" in Teradata verwenden können. –

+0

Ich habe ein wenig Probleme mit dem Teil der Anweisung, die meine Value-Spalte verwendet. Vielleicht hat es damit zu tun, in der Lag-Funktion zu sein. Der Fehler lautet "Datentyp" Wert "stimmt nicht mit einem definierten Typnamen überein". Ich sehe einige Seiten, die angeben, dass lag() nicht in Teradata existiert. –

+0

LAG() und LEAD() sind in den aktuellen Releases von Teradata nicht implementiert. Wenn die richtigen Fenster definiert sind, kann MAX() verwendet werden, um dasselbe zu erreichen, wie es von vkp gezeigt wird. –

0

Sie können dies versuchen.

select id,dt,value 
from (select t1.* 
     ,max(case when t2.value<t1.value then t1.dt end) over(partition by t1.id) as max_dt 
     from (select t.*,min(dt) over(partition by id order by dt rows between 1 preceding and 1 preceding) as prev_dt 
      from t 
      ) t1 
     join t t2 on t1.prev_dt=t2.dt and t1.id=t2.id    
    ) t 
where max_dt=dt 
Verwandte Themen