MySQL obtient efficacement les N premières lignes de données pour chaque groupe
Description du problème :
Dans une requête de base de données, vous devrez peut-être récupérer uniquement les N premières lignes de données pour chaque groupe de données. Par exemple, votre ensemble de données peut contenir plusieurs lignes d'informations regroupées par année et ID. Si vous souhaitez afficher les cinq enregistrements les mieux notés pour chaque ID, vous devez mettre en œuvre une méthode pour limiter les résultats au nombre souhaité.
Solution :
Dans MySQL 8 ou version ultérieure, vous pouvez utiliser les fonctions ROW_NUMBER, RANK ou DENSE_RANK pour y parvenir. La fonction spécifique que vous choisissez dépend de la définition exacte des « N premières lignes » et de la manière de gérer les situations parallèles. Voici une répartition des résultats générés par ces fonctions :
Exemple :
La requête suivante utilise la fonction ROW_NUMBER pour renvoyer les 5 premières lignes de chaque identifiant, triées par note par ordre décroissant :
<code class="language-sql">SELECT year, id, rate FROM ( SELECT year, id, rate, ROW_NUMBER() OVER (PARTITION BY id ORDER BY rate DESC) AS rank_num FROM h WHERE year BETWEEN 2000 AND 2009 ) AS subquery WHERE rank_num <= 5;</code>
Sortie :
year | id | rate |
---|---|---|
2006 | p01 | 8.0 |
2003 | p01 | 7.4 |
2008 | p01 | 6.8 |
2001 | p01 | 5.9 |
2007 | p01 | 5.3 |
2001 | p02 | 12.5 |
2004 | p02 | 12.4 |
2002 | p02 | 12.2 |
2003 | p02 | 10.3 |
2000 | p02 | 8.7 |
En utilisant ces fonctions, vous pouvez limiter efficacement les résultats aux N premières lignes de chaque groupe et garantir l'ordre souhaité des données.
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!