Maison > base de données > tutoriel mysql > SQL RANK() vs ROW_NUMBER() : quand devez-vous utiliser chaque fonction ?

SQL RANK() vs ROW_NUMBER() : quand devez-vous utiliser chaque fonction ?

DDD
Libérer: 2025-01-13 16:46:43
original
923 Les gens l'ont consulté

SQL RANK() vs. ROW_NUMBER(): When Should You Use Each Function?

Compréhension approfondie des fonctions RANK() et ROW_NUMBER() en SQL

Les fonctions RANK() et ROW_NUMBER() en SQL prêtent souvent à confusion, et cet article vise à clarifier les différences entre les deux.

Tout d'abord, il convient de noter que s'il n'y a pas de valeurs en double dans la partition, les résultats des requêtes SQL de ces deux fonctions seront exactement les mêmes. Cependant, lorsque des valeurs en double apparaissent, la différence devient apparente.

Valeurs en double et certitude

La fonction

ROW_NUMBER() attribue une valeur incrémentielle unique à chaque ligne d'une partition, même si les lignes ont la même valeur dans la colonne de tri. Cela signifie que ROW_NUMBER() n'est pas déterministe et que la valeur qu'il attribue peut changer arbitrairement à chaque requête.

En revanche, RANK() et DENSE_RANK() sont tous deux déterministes au sein d'une partition. Plusieurs lignes se verront attribuer la même valeur de classement si elles ont la même valeur sur la colonne de tri et la colonne de partitionnement.

Exemple

Considérons l'exemple suivant :

<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

Dans cet exemple, lors du tri par ID au sein de la même partition (StyleID), les trois premières lignes sont dupliquées. Voici comment chaque fonction gère ces valeurs en double :

  • ROW_NUMBER() attribue des valeurs croissantes (1, 2, 3) et ignore les valeurs en double.
  • RANK() attribue aux trois lignes en double la même valeur de classement (1), puis passe à 4 pour la valeur différente suivante.
  • DENSE_RANK() attribue également aux lignes en double la même valeur de classement (1), mais incrémente à 2 pour la valeur différente suivante.

Conclusion

RANK() et DENSE_RANK() maintiennent des classements cohérents au sein des partitions même en présence de valeurs en double. Cependant, ROW_NUMBER() attribue arbitrairement des valeurs croissantes, ce qui peut conduire à des résultats imprévisibles. Comprendre ces différences vous aidera à choisir la fonction appropriée en fonction de vos besoins SQL spécifiques.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal