Maison >base de données >tutoriel mysql >Comment extraire efficacement les N premiers enregistrements de données groupées ?

Comment extraire efficacement les N premiers enregistrements de données groupées ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-25 10:05:09268parcourir

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

Extraire efficacement les meilleurs enregistrements dans des données groupées

Supposons qu'il existe un ensemble de données structurées contenant des colonnes telles que la personne, le groupe et l'âge. Cet article explique comment obtenir les N premiers individus de chaque groupe en fonction de l'âge.

Résultats attendus :

Le but est de récupérer les deux individus les plus âgés de chaque groupe, triés par ordre alphabétique de nom s'ils ont le même âge.

Solutions existantes :

L'approche précédente (inspirée de la requête proposée par @Bohemian) récupère une seule ligne de premier niveau pour chaque groupe :

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

Solution améliorée utilisant UNION :

Une façon d'étendre cette fonctionnalité est d'utiliser l'opérateur UNION ALL, pouvant ainsi récupérer un nombre spécifié d'enregistrements pour chaque groupe :

<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>

Une alternative à l'utilisation des numéros de ligne :

Une autre approche consiste à générer un numéro de ligne pour chaque enregistrement puis à filtrer en fonction de ce numéro de ligne :

<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>

Conclusion :

En fonction des exigences spécifiques et des caractéristiques des données, les techniques de numérotation UNION et de ligne fournissent des solutions efficaces pour récupérer des enregistrements de niveau supérieur dans des résultats groupés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn