2017-06-05 3 views
1

Ich habe eine Tabelle wie wie untenOracle-Partition mit 2 Spalten

Id RC_CLASS RC_DATE RC_TYPE 
14 FI-321619 22-Jan-16 S 
14 FI-399481 29-Jan-16 D 
14 FI-321619 20-Jan-17 S 

Hier ist, was ich versucht

SELECT * 
FROM (SELECT rc.*, 
      RANK() OVER (PARTITION BY ID,RC_CLASS order by rc__date) AS LATEST_VERSION 
     FROM table 
    ) 
WHERE LATEST_VERSION = 1 
ORDER BY rc_vendorid; 

Erwartete Ausgabe

Id RC_CLASS RC_DATE RC_TYPE 
14 FI-399481 29-Jan-16 D 
14 FI-321619 20-Jan-17 S 

Ich möchte Gruppe von ID und Klasse und bringe am RC_DATE eine Top-Sorte mit. Was ich bekomme, ist immer das oberste basierend auf Datum, Partition funktioniert hier nicht. Was fehlt?

+0

Was ist das Problem mit Ihrer Abfrage? –

Antwort

3

Ich denke, Sie sind sehr nahe. Grundsätzlich müssen Sie nur eine absteigend sortieren, um die neueste Version zu erhalten:

SELECT rc.* 
FROM (SELECT rc.*, 
      RANK() OVER (PARTITION BY ID, RC_CLASS ORDER BY rc_date DESC) AS LATEST_VERSION 
     FROM table rc 
    ) rc 
WHERE LATEST_VERSION = 1 
ORDER BY rc_vendorid; 

Ich nehme zur Kenntnis, dass Sie RANK() für diese. Dies kann Duplikate zurückgeben, wenn Sie zwei Zeilen am selben Datum haben. Wenn das nicht wünschenswert ist, können Sie ROW_NUMBER() verwenden, die beliebig wählen würde (wenn alle anderen Schlüssel identisch sind).

+0

Danke, es hat funktioniert. Wie du schon sagtest, habe ich ROW_NUMBER() benutzt, was mir genau das gab, was ich brauche. Rank gab mir 396 Datensätze und ROW_NUMBER gab mir 394, 2 Duplikate. Perfekt – Pat