Heim >Datenbank >MySQL-Tutorial >Wie kann ich Werte basierend auf dem Maximum einer zugehörigen Spalte in SQL effizient abrufen?
Erhalten Sie effizient Daten basierend auf dem Maximalwert der relevanten Spalte
In Szenarien, in denen Sie einen bestimmten Spaltenwert basierend auf dem Maximalwert der zugehörigen Spalte und gruppiert nach einer dritten Spalte abrufen müssen, bietet SQL eine optimierte Lösung. Betrachten Sie die folgende Tabelle, die Daten für die Spalten KEY, NUM und VAL enthält:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
Ziel ist es, aus diesen Daten folgende Ergebnisse abzurufen:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Während die in der Frage bereitgestellte Abfrage dieses Ergebnis erzielt, gibt es eine elegantere Möglichkeit, row_number()
zu verwenden:
<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 partitioniert Zeilen effizient basierend auf der KEY-Spalte und weist Zeilennummern in absteigender Reihenfolge seqnum
innerhalb jeder Partition zu. Durch die Auswahl von Zeilen, in denen seqnum
gleich 1 ist, erhalten wir das gewünschte Ergebnis und behalten die gewünschte Gruppierung bei.
Es ist erwähnenswert, dass sich diese Methode geringfügig von der ursprünglichen Abfrage unterscheidet, da sie immer eine Zeile pro Schlüssel zurückgibt, während die ursprüngliche Abfrage möglicherweise mehrere Zeilen zurückgibt. Wenn dieses Verhalten gewünscht ist, kann rank()
oder dense_rank()
anstelle von row_number()
verwendet werden.
Das obige ist der detaillierte Inhalt vonWie kann ich Werte basierend auf dem Maximum einer zugehörigen Spalte in SQL effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!