Maison > base de données > tutoriel mysql > Comment récupérer uniquement les n lignes supérieures par groupe dans MySQL?

Comment récupérer uniquement les n lignes supérieures par groupe dans MySQL?

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

How to Retrieve Only the Top N Rows per Group in MySQL?

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 :

  • ROW_NUMBER : Attribue un numéro de séquence aux lignes de chaque groupe, en commençant par 1. Cette fonction est idéale si vous souhaitez départager les égalités en attribuant le même rang aux lignes ayant la même valeur.
  • RANK : Attribue un classement aux lignes au sein de chaque groupe, les égalités donneront le même classement. Cette fonction est utile si vous priorisez différents classements.
  • DENSE_RANK : Similaire au RANK, mais il attribue des classements denses, ce qui signifie que même en cas d'égalité, il n'y a pas d'écart entre les classements. Cette fonction convient lorsque vous souhaitez garantir que les lignes suivantes ont un classement unique.

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>
Copier après la connexion

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!

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