Maison > base de données > tutoriel mysql > SQL RANK() vs ROW_NUMBER() : en quoi diffèrent-ils lors de la gestion des lignes liées ?

SQL RANK() vs ROW_NUMBER() : en quoi diffèrent-ils lors de la gestion des lignes liées ?

Patricia Arquette
Libérer: 2025-01-13 17:01:42
original
867 Les gens l'ont consulté

SQL RANK() vs. ROW_NUMBER(): How Do They Differ When Handling Tied Rows?

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

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

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!

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