Maison > base de données > tutoriel mysql > SQL RANK() vs ROW_NUMBER() : quelle est la différence ?

SQL RANK() vs ROW_NUMBER() : quelle est la différence ?

Mary-Kate Olsen
Libérer: 2025-01-13 16:52:44
original
641 Les gens l'ont consulté

SQL RANK() vs. ROW_NUMBER(): What's the Difference?

Différences entre SQL RANK() et ROW_NUMBER()

Lors de l'utilisation des fonctions de classement SQL, il est essentiel de comprendre la différence entre RANK() et ROW_NUMBER(). Bien qu'ils puissent se ressembler dans certains cas, ils peuvent se comporter différemment lorsqu'ils traitent des valeurs en double.

Comparaison de ROW_NUMBER() et RANK()

ROW_NUMBER() attribue une valeur entière consécutive à chaque ligne, que les valeurs de la colonne de tri soient identiques ou non. Cela signifie que ROW_NUMBER() attribuera toujours un entier unique à chaque ligne.

RANK(), quant à lui, attribue un rang à chaque ligne en fonction de l'ordre de tri de la ligne dans la partition. Les lignes avec la même valeur de tri recevront le même classement. En cas d'égalité, cela entraîne des écarts dans le classement.

Démo

La requête SQL suivante montre la différence entre ROW_NUMBER() et RANK() :

<code class="language-sql">SELECT ID, [Description], RANK() OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank' FROM SubStyle</code>
Copier après la connexion
<code class="language-sql">SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle</code>
Copier après la connexion

En utilisant ces requêtes, les deux ensembles de résultats semblent initialement identiques. Toutefois, en cas d'égalité au classement, la différence devient apparente. Considérez les exemples de données suivants :

<code class="language-sql">WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [RANK],
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS [ROW_NUMBER],
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [DENSE_RANK]
FROM T</code>
Copier après la connexion

Résultat :

<code>StyleID     ID       RANK      ROW_NUMBER      DENSE_RANK
----------- -------- --------- --------------- ----------
1           1        1         1               1
1           1        1         2               1
1           1        1         3               1
1           2        4         4               2</code>
Copier après la connexion

Dans cet exemple, ROW_NUMBER() incrémentera même s'il y a égalité, tandis que RANK() attribuera le même rang à toutes les lignes à égalité. DENSE_RANK() est comme RANK(), mais attribue le prochain rang différent (2) à la prochaine valeur de classement différente.

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