2017-03-28 8 views
0

Ich habe diese Datensätze:Rang/Finding Termine

PHOT 1/16/2017 20170118 0.01 
PHOT 1/16/2017 20170117 0.0103 
PHOT 1/16/2017 20170116 0.0101 
PHOT 1/16/2017 20170115 0.0101 
PHOT 1/16/2017 20170114 0.0105 
. 
. 
. 
MSRT 12/31/2016 20170327 0.855 
MSRT 12/31/2016 20170324 0.87 
MSRT 12/31/2016 20170323 0.87 
MSRT 12/31/2016 20170322 0.88 
MSRT 12/31/2016 20170321 0.89 
. 
. 
. 

Grundsätzlich muss ich den Rekord mit dem nächsten Termin in Spalte 3, die < = das Datum in Spalte 2.

Es sollte aufgeteilt werden Spalte 1. Ich benötige nur einen Datensatz, da dieser der Wert ist, der das Datum der Spalte 2 für Spalte 2 enthält.

Kann dies mit etwas DENSE_RANK getan werden? Oder sollte ich ROW_NUMBER verwenden? Hilfe

+0

Was sind die Datentypen der Spalte2 und 3? – GurV

+0

DENSE_RANK und ROW_NUMBER werden das gleiche Ergebnis liefern, wenn es keine Duplikate für (Spalte1, Spalte3) gibt. Wenn es Duplikate gibt, ist Ihr Problem nicht vollständig angegeben: Wenn Sie für die gleiche Zeichenfolge in Spalte1 zwei oder mehr Zeilen für das "nächste Datum" in Spalte3 haben, die ausgewählt werden sollen? (Oder alle?) Hier ist entweder DENSE_RANK oder ROW_NUMBER die richtige Wahl; Welches die richtige Wahl ist, hängt von Ihrer Geschäftsanforderung ab. – mathguy

Antwort

0

sollte die folgende Abfrage:

Select * from (
select row_number() over (partition by t.col1 order by  
abs(t.col2-to_date(t.col3, 'yyyymmdd'))) rw, t.* 
From tbl t where t.col2 >= to_date(t.col3, 'yyyymmdd')) where rw = 1; 

Erläuterung:

Die innere Abfrage die to_date Funktion auf dem col3 für Format, das Datum zu dem gleichen Muster wie col2 verwenden.

Dann können wir es mit col2 in der Where-Klausel vergleichen. Als nächstes ordnen wir den absoluten Abstand zwischen diesen beiden Spalten (wiederum mit to_date) für jedes col1 (Partition nach col1, Reihenfolge nach abs).

Schließlich nehmen wir die obere Reihe für jede col1 Gruppe (rw = 1).

Beachten Sie, dass, wenn Sie dose_ranke verwenden, kann es mehrere Zeilen für jeden col1 erstellen, denn wenn Sie 2 Zeilen mit dem gleichen absoluten Wert haben - rankt der Dichte_ranke ihnen die gleiche Nummer (sagen wir -1), und dann Sie können für jede Spalte wenige Zeilen erhalten. Zeilennummer gibt immer einen eindeutigen Rang für jede Zeile.

+0

Super! Es klappt. Vielen Dank!!!! –

+0

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-results) wirklich, um die Qualität Ihres zu verbessern Post. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. –

+0

wahr. Jetzt gibt es eine Erklärung. Vielen Dank. – user2671057