Oracle SQL: Extrahieren von Werten, die mit maximalen Spaltenwerten innerhalb von Gruppen verknüpft sind
Eine häufige Datenbankaufgabe besteht darin, Werte auszuwählen, die dem Maximalwert einer Spalte zugeordnet sind, insbesondere beim Umgang mit gruppierten Daten. Betrachten wir eine Tabelle mit den Spalten KEY
, NUM
und VAL
:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
Das Ziel besteht darin, das Maximum NUM
für jedes KEY
und das entsprechende VAL
zu finden. Die gewünschte Ausgabe:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Eine Methode verwendet eine Unterabfrage:
<code class="language-sql">select KEY, VAL from TABLE_NAME TN where NUM = ( select max(NUM) from TABLE_NAME TMP where TMP.KEY = TN.KEY );</code>
Ein effizienterer und lesbarerer Ansatz verwendet jedoch die Funktion ROW_NUMBER()
:
<code class="language-sql">select key, val from (select t.*, row_number() over (partition by key order by num desc) as seqnum from table_name t ) t where seqnum = 1;</code>
Dadurch wird innerhalb jeder KEY
-Gruppe eine Rangfolge basierend auf absteigenden NUM
-Werten zugewiesen. Die WHERE
-Klausel filtert dann nach dem obersten Rang (seqnum = 1
) und liefert das gewünschte Ergebnis:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Während beide Methoden das gleiche Ergebnis erzielen, bietet der ROW_NUMBER()
-Ansatz im Allgemeinen eine bessere Leistung und Klarheit, insbesondere bei größeren Datensätzen. Die optimale Wahl hängt von den spezifischen Bedürfnissen und Vorlieben ab, ROW_NUMBER()
bietet jedoch eine robuste und elegante Lösung für dieses häufige SQL-Problem.
Das obige ist der detaillierte Inhalt vonWie kann man mit maximalen Spaltenwerten innerhalb von Gruppen in Oracle SQL verknüpfte Werte effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!