Maison > base de données > tutoriel mysql > Comment récupérer les N personnes les plus âgées de chaque groupe dans un ensemble de données ?

Comment récupérer les N personnes les plus âgées de chaque groupe dans un ensemble de données ?

Susan Sarandon
Libérer: 2025-01-25 10:06:11
original
566 Les gens l'ont consulté

How to Retrieve the Top N Oldest People from Each Group in a Dataset?

sélectionnant efficacement les individus les plus âgés de chaque groupe

Cet article montre deux méthodes pour récupérer le N supérieur (dans ce cas, deux) individus les plus âgés de chaque groupe au sein d'un ensemble de données. Le premier utilise une approche UNION ALL, tandis que le second utilise la numérotation des lignes pour une solution plus évolutive.

Méthode 1: Union all (adapté à un petit nombre fixe de groupes)

Cette méthode est simple pour un nombre connu et limité de groupes. Il sélectionne les n plus anciens des personnes de chaque groupe individuellement et combine les résultats. Cependant, cette approche devient lourde et inefficace à mesure que le nombre de groupes augmente.

<code class="language-sql">(
  SELECT *
  FROM mytable
  WHERE `group` = 1  -- Group 1
  ORDER BY age DESC
  LIMIT 2
)
UNION ALL
(
  SELECT *
  FROM mytable
  WHERE `group` = 2  -- Group 2
  ORDER BY age DESC
  LIMIT 2
)
-- ... Add more UNION ALL clauses for additional groups</code>
Copier après la connexion

Méthode 2: Numérotation des lignes (solution évolutive pour un grand ou inconnu de groupes)

Cette méthode attribue dynamiquement un numéro de ligne à chaque individu au sein de ses groupes respectifs, ordonnés par âge dans l'ordre descendant. Cela permet une sélection efficace des N plus âgés des n plus âgés dans tous les groupes.

<code class="language-sql">SELECT person, `group`, age
FROM
(
   SELECT person, `group`, age,
      (@num:=IF(@group = `group`, @num +1, IF(@group := `group`, 1, 1))) AS 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 -- Select the top 2 from each group</code>
Copier après la connexion

Cette approche exploite respectivement les variables @num et @group pour suivre le numéro de ligne et le groupe. Le CROSS JOIN initialise ces variables. La clause finale WHERE filtre les résultats pour inclure uniquement les 2 premiers individus de chaque groupe. Cette méthode est nettement plus efficace et adaptable que l'approche UNION ALL pour les ensembles de données avec de nombreux groupes.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal