Top-N-Datensätze pro Gruppe in SQL abrufen
Diese Anleitung zeigt, wie Sie die obersten N Datensätze für jede Gruppe in einer SQL-Tabelle effizient abrufen können, sortiert nach Alter (absteigend) und dann alphabetisch nach dem Namen der Person, um Gleichstände zu behandeln.
Szenario:
Stellen Sie sich eine Tabelle vor, die Informationen über Personen, ihre Gruppenzugehörigkeit und ihr Alter enthält:
Person | Group | Age |
---|---|---|
Bob | 1 | 32 |
Jill | 1 | 34 |
Shawn | 1 | 42 |
Jake | 2 | 29 |
Paul | 2 | 36 |
Laura | 2 | 39 |
Das Ziel besteht darin, die Top-2-Datensätze (N=2) für jede Gruppe abzurufen, ältere Personen zu priorisieren und Zusammenhänge in alphabetischer Reihenfolge aufzulösen. Die gewünschte Ausgabe ist:
Person | Group | Age |
---|---|---|
Shawn | 1 | 42 |
Jill | 1 | 34 |
Laura | 2 | 39 |
Paul | 2 | 36 |
Lösungen:
Zwei gemeinsame Ansätze werden dargestellt: UNION ALL
und die Fensterfunktion ROW_NUMBER()
.
Methode 1: Mithilfe von Union All (weniger effizient für große Datensätze)
Diese Methode ist unkompliziert, kann aber für Tabellen mit vielen Gruppen und einer großen Anzahl von Datensätzen pro Gruppe ineffizient werden. Dazu gehört es, eine separate Abfrage für jede Gruppe zu erstellen und die Ergebnisse mit UNION ALL
zu kombinieren. In diesem Beispiel wird die Top 2 Datensätze (n = 2) für jede Gruppe abgerufen:
<code class="language-sql">( SELECT * FROM mytable WHERE `group` = 1 ORDER BY age DESC, person LIMIT 2 ) UNION ALL ( SELECT * FROM mytable WHERE `group` = 2 ORDER BY age DESC, person LIMIT 2 )</code>
Dieser Ansatz erfordert eine Änderung für jede zusätzliche Gruppe. Es ist für eine große Anzahl von Gruppen nicht skalierbar.
Methode 2: Verwenden Sie row_number () (effizienter)
Die Fensterfunktion ROW_NUMBER()
bietet eine effizientere und skalierbare Lösung. Es weist jeder Zeile in jeder Gruppe einen eindeutigen Rang zu, basierend auf der angegebenen Reihenfolge.
<code class="language-sql">SELECT person, `group`, age FROM ( SELECT person, `group`, age, ROW_NUMBER() OVER (PARTITION BY `group` ORDER BY age DESC, person) as rn FROM mytable ) as ranked_data WHERE rn <= 2;</code>
Diese Abfrage weist jeder Zeile in jeder Gruppe zunächst einen Rang (rn
) zu, der nach Alter (absteigend) und dann nach dem Namen der Person bestellt. Die äußere Abfrage filtert dann die Ergebnisse so, dass sie nur die Zeilen enthalten, in denen der Rang kleiner oder gleich 2 (n = 2) ist. Dieser Ansatz ist weitaus effizienter und leicht an verschiedene Werte von n und eine variable Anzahl von Gruppen anpassbar.
Weitere Lesen:
Für eine umfassende Untersuchung von Techniken zur Auswahl von Top -N -Datensätzen pro Gruppe finden Sie in dieser Ressource: https://www.php.cn/link/131632cb7eEEEEB986974E1BE59AF67E8FE
Das obige ist der detaillierte Inhalt vonWie rufe ich die Top N -Datensätze für jede Gruppe in SQL ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!