Récupérer les deux meilleurs scores pour des groupes individuels en SQL
Dans une base de données relationnelle, l'extraction de données significatives à partir de grands ensembles de données implique souvent de regrouper des enregistrements en fonction sur des caractéristiques spécifiques. Lors de la récupération de données à partir d'ensembles groupés, il est courant d'obtenir les valeurs les plus élevées ou les plus basses au sein de chaque groupe à l'aide de fonctions d'agrégation. Cependant, que se passe-t-il si vous devez sélectionner les N premières lignes pour chaque groupe ?
Considérez le tableau suivant avec les noms des étudiants et leurs scores correspondants :
NAME | SCORE |
---|---|
willy | 1 |
willy | 2 |
willy | 3 |
zoe | 4 |
zoe | 5 |
zoe | 6 |
La fonction d'agrégation pour le regroupement permet uniquement vous d'obtenir le score le plus élevé pour chaque nom. Pour récupérer les deux meilleurs scores de chaque élève, une approche différente est nécessaire.
La requête suivante y parvient en utilisant une sous-requête pour suivre le classement des scores de chaque élève au sein de leurs groupes respectifs :
SELECT * FROM test s WHERE ( SELECT COUNT(*) FROM test f WHERE f.name = s.name AND f.score >= s.score ) <= 2
Décomposition de la requête :
La sous-requête, entre parenthèses, calcule le rang du score de chaque élève :
Sortie :
L'exécution de cette requête renverra les résultats suivants :
NAME | SCORE |
---|---|
willy | 2 |
willy | 3 |
zoe | 5 |
zoe | 6 |
Cette requête récupère efficacement les deux premiers scores pour chaque élève, offrant une vue plus complète de leurs performances par rapport à l'utilisation d'une simple agrégation MAX().
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!