Heim > Datenbank > MySQL-Tutorial > Wie rufe ich die Top N -Datensätze für jede Gruppe in SQL ab?

Wie rufe ich die Top N -Datensätze für jede Gruppe in SQL ab?

Susan Sarandon
Freigeben: 2025-01-25 09:52:09
Original
145 Leute haben es durchsucht

How to Retrieve the Top N Records for Each Group in SQL?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage