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!