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
Mary-Kate Olsenoriginal
2025-01-13 16:52:44645parcourir

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>
<code class="language-sql">SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle</code>

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>

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>

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!

Déclaration:
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