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
Susan Sarandonoriginal
2025-01-25 10:06:11626parcourir

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>

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>

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!

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