Différences entre SQL RANK() et ROW_NUMBER()
La différence entre les fonctions RANK() et ROW_NUMBER() dans SQL déroute souvent les développeurs. Même si les instructions de requête SQL fournies peuvent sembler initialement produire les mêmes résultats, elles s'exécuteront différemment en présence de valeurs identiques.
Plongez dans les différences
La principale différence entre les fonctions RANK() et ROW_NUMBER() réside dans la façon dont elles gèrent des valeurs identiques. RANK() et sa fonction DENSE_RANK() correspondante présentent un comportement déterministe. Lorsque plusieurs lignes ont la même valeur sur les colonnes de partitionnement et de tri, le même rang leur est attribué.
En revanche, ROW_NUMBER() attribue des valeurs de résultat croissantes même pour les lignes de même valeur. Ce comportement est non déterministe, ce qui signifie que l'ordre des lignes identiques dans le jeu de résultats peut changer arbitrairement.
Exemple de description
Considérez le scénario suivant : toutes les lignes partagent le même StyleID, formant une partition. Au sein de cette partition, les trois premières lignes sont équivalentes lorsqu'elles sont triées par ID.
<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>
Le résultat est le suivant :
<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>
Comme vous pouvez le voir, ROW_NUMBER() attribue progressivement des valeurs numériques aux lignes identiques, tandis que RANK() et DENSE_RANK() attribuent le même rang aux trois lignes identiques. DENSE_RANK() se comporte comme RANK(), mais il attribue la valeur différente suivante 2 aux lignes suivantes pour éviter les lacunes dans la séquence de classement.
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!