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 fonctionROW_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>
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 :
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!