Maison >base de données >tutoriel mysql >SQL RANK() vs ROW_NUMBER() : quelle est la différence ?
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!