Heim >Datenbank >MySQL-Tutorial >Wie extrahiere ich die Top -N -Datensätze aus gruppierten Daten effizient?

Wie extrahiere ich die Top -N -Datensätze aus gruppierten Daten effizient?

Barbara Streisand
Barbara StreisandOriginal
2025-01-25 10:05:09268Durchsuche

How to Efficiently Extract the Top N Records from Grouped Data?

Top-Datensätze in gruppierten Daten effizient extrahieren

Angenommen, es gibt einen strukturierten Datensatz mit Spalten wie Person, Gruppe und Alter. In diesem Artikel wird untersucht, wie man die Top-N-Personen in jeder Gruppe basierend auf dem Alter ermittelt.

Erwartete Ergebnisse:

Das Ziel besteht darin, die beiden ältesten Personen in jeder Gruppe zu finden, alphabetisch nach Namen sortiert, sofern sie gleich alt sind.

Bestehende Lösungen:

Der vorherige Ansatz (inspiriert von der von @Bohemian vorgeschlagenen Abfrage) ruft eine einzelne Zeile der obersten Ebene für jede Gruppe ab:

<code class="language-sql">select * 
from (select * from mytable order by `Group`, Age desc, Person) x
group by `Group`</code>

Erweiterte Lösung mit UNION:

Eine Möglichkeit, diese Funktionalität zu erweitern, besteht darin, den UNION ALL-Operator zu verwenden und so eine bestimmte Anzahl von Datensätzen für jede Gruppe abzurufen:

<code class="language-sql">(
  select *
  from mytable 
  where `group` = 1
  order by age desc
  LIMIT 2
)
UNION ALL
(
  select *
  from mytable 
  where `group` = 2
  order by age desc
  LIMIT 2
)</code>

Eine Alternative zur Verwendung von Zeilennummern:

Ein anderer Ansatz besteht darin, für jeden Datensatz eine Zeilennummer zu generieren und dann basierend auf dieser Zeilennummer zu filtern:

<code class="language-sql">select person, `group`, age
from 
(
   select person, `group`, age,
      (@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number 
  from test t
  CROSS JOIN (select @num:=0, @group:=null) c
  order by `Group`, Age desc, person
) as x 
where x.row_number <= 2;</code>

Fazit:

Je nach spezifischen Anforderungen und Dateneigenschaften bieten sowohl UNION- als auch Zeilennummerierungstechniken effektive Lösungen zum Abrufen von Datensätzen der obersten Ebene in gruppierten Ergebnissen.

Das obige ist der detaillierte Inhalt vonWie extrahiere ich die Top -N -Datensätze aus gruppierten Daten effizient?. 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