Heim >Datenbank >MySQL-Tutorial >Wie kann ich den Maximalwert und den zugehörigen Wert in SQL mit Gruppierung effizient abrufen?

Wie kann ich den Maximalwert und den zugehörigen Wert in SQL mit Gruppierung effizient abrufen?

DDD
DDDOriginal
2025-01-17 19:26:101011Durchsuche

How Can I Efficiently Retrieve the Maximum Value and Associated Value in SQL with Grouping?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn