Extrahieren des höchsten VAL für jeden SCHLÜSSEL in Oracle SQL
Diese Anleitung zeigt, wie Sie mithilfe von Oracle SQL effizient das Maximum VAL
für jedes KEY
in gruppierten Daten abrufen können. Sehen wir uns ein häufiges Szenario an:
Eine Tabelle mit dem Namen TABLE_NAME
enthält die folgenden Daten:
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, eine Ergebnismenge zu generieren, die nur das Maximum VAL
für jedes eindeutige KEY
:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Effiziente Oracle SQL-Lösung (10g und höher):
Während Unterabfragen dies erreichen können, verwendet eine elegantere und oft schnellere Lösung die ROW_NUMBER()
Analysefunktion:
<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>
Diese Abfrage weist zunächst jeder Zeile innerhalb jeder seqnum
-Partition einen Rang (KEY
) zu, sortiert nach NUM
in absteigender Reihenfolge. Anschließend werden die Ergebnisse so gefiltert, dass nur Zeilen mit seqnum = 1
enthalten sind. Dabei wird effektiv die Zeile mit dem höchsten NUM
(und damit implizit dem höchsten VAL
) ausgewählt, wobei eine konsistente Beziehung zwischen NUM
und VAL
innerhalb jeder Zeile vorausgesetzt wird Schlüssel).
Wichtiger Hinweis: Diese Methode garantiert eine Zeile pro KEY
. Wenn Sie potenzielle Bindungen in NUM
anders behandeln müssen (z. B. mehrere Zeilen für ein KEY
zurückgeben, wenn mehrere Zeilen das Maximum NUM
teilen), sollten Sie RANK()
oder DENSE_RANK()
anstelle von ROW_NUMBER()
verwenden.
Das obige ist der detaillierte Inhalt vonWie rufe ich mit Oracle SQL den maximalen VAL für jeden SCHLÜSSEL in gruppierten Daten ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!