Ich habe einen Tisch wie diesen:
ID | Val | Kind
----------------------
1 | 1337 | 2
2 | 1337 | 1
3 | 3 | 4
4 | 3 | 4
Ich möchte eine machen SELECT
, die nur die erste Zeile für jede Val
zurückgibt, indem ich nach bestelle Kind
.
Beispielausgabe:
ID | Val | Kind
----------------------
2 | 1337 | 1
3 | 3 | 4
Wie kann ich diese Abfrage erstellen?
oracle
greatest-n-per-group
BrunoLM
quelle
quelle
ORDER BY ID DESC
, aber das ist für die Frage nicht relevant. In diesem Beispiel ist mir das egal.Antworten:
Diese Lösung verwendet
keep
aber auchval
undkind
kann auch einfach für jede Gruppe ohne Unterabfrage berechnet werden:dbfiddle hier
KEEP… FIRST und KEEP… LAST sind eine Oracle-spezifische Funktion von Aggregaten. Sie können sie dann hier in den Oracle-Dokumenten oder auf ORACLE_BASE nachlesen :
quelle
Verwenden Sie einen allgemeinen Tabellenausdruck (CTE) und eine Fenster- / Rang- / Partitionierungsfunktion wie ROW_NUMBER .
Diese Abfrage erstellt eine speicherinterne Tabelle mit dem Namen ORDERED und fügt eine zusätzliche Spalte von rn hinzu, bei der es sich um eine Folge von Zahlen von 1 bis N handelt. PARTITION BY gibt an, dass der Neustart bei jeder Änderung des Werts von Val und bei der Bestellung erfolgen soll Zeilen durch den kleinsten Wert von Kind.
Der obige Ansatz sollte mit jedem RDBMS funktionieren, das die Funktion ROW_NUMBER () implementiert hat. Oracle verfügt über einige elegante Funktionen, die in der Antwort von mik zum Ausdruck kommen und im Allgemeinen eine bessere Leistung als diese Antwort liefern.
quelle
Die Lösung von bilinkc funktioniert gut, aber ich dachte, ich würde auch meine rausschmeißen. Es hat die gleichen Kosten, ist aber möglicherweise schneller (oder langsamer, ich habe es nicht getestet). Der Unterschied besteht darin, dass First_Value anstelle von Row_Number verwendet wird. Da uns nur der erste Wert interessiert, ist er meiner Meinung nach einfacher.
Testdaten.
Wenn Sie es vorziehen, finden Sie hier das CTE-Äquivalent.
quelle
id
sei denn, sie sind eindeutig.Mit können
keep
Sieid
aus jeder Gruppe eine auswählen :dbfiddle hier
quelle
quelle