Eine elegante Lösung, um den Maximalwert und die zugehörigen Werte in der SQL-Gruppierung effizient zu erhalten
In SQL ist es oft schwierig, den Maximalwert in einer anderen Spalte zu finden und den zugehörigen Wert basierend auf der dritten Spalte nach der Gruppierung zu erhalten. Stellen Sie sich das folgende Szenario vor:
Folgende Formulare stehen zur Verfügung:
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, den VAL-Wert zu finden, der der maximalen NUM für jeden SCHLÜSSEL entspricht. Die erwarteten Ergebnisse sind wie folgt:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
Obwohl die folgende Abfrage verwendet werden kann, um das Ziel zu erreichen:
<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>
Aber wenn es viele KEY-Werte gibt, scheint diese Methode unhandlich zu sein. Die Verwendung der Funktion row_number()
bietet jedoch eine elegantere Lösung:
<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 Methode nutzt die Konzepte der Partitionierung und Sortierung, um die gewünschten Ergebnisse zu erzielen. Durch Festlegen der Partition von row_number()
auf KEY und Sortieren nach NUM in absteigender Reihenfolge wird jeder Zeile in jeder Partition eine Sequenznummer zugewiesen. Wählen Sie dann die Zeile mit der Seriennummer 1 aus, um den maximalen NUM-Wert für jeden KEY und den zugehörigen VAL-Wert zu erhalten.
Es ist wichtig zu beachten, dass sich dieser verbesserte Ansatz etwas anders verhält als die ursprüngliche Abfrage. Die ursprüngliche Abfrage gibt möglicherweise mehrere Zeilen für jeden SCHLÜSSEL zurück, während diese Lösung sicherstellt, dass nur eine Zeile pro SCHLÜSSEL zurückgegeben wird. Wenn Sie das ursprüngliche Verhalten beibehalten möchten, können Sie dense_rank()
durch rank()
oder row_number()
ersetzen.
Das obige ist der detaillierte Inhalt vonWie kann ich den Maximalwert und den zugehörigen Wert in SQL mit Gruppierung effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!