Vous ne verrez la différence que si vous avez des liens dans une partition pour une valeur de commande particulière.
RANK
et DENSE_RANK
sont déterministes dans ce cas, toutes les lignes avec la même valeur pour les colonnes de classement et de partitionnement aboutiront à un résultat égal, alors ROW_NUMBER
qu'elles attribueront arbitrairement (de manière non déterministe) un résultat incrémentiel aux lignes liées.
Exemple: (Toutes les lignes sont identiques StyleID
et sont donc dans la même partition et dans cette partition, les 3 premières lignes sont liées lorsqu'elles sont triées par ID
)
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
Retour
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
Vous pouvez voir que pour les trois lignes identiques les ROW_NUMBER
incréments, la RANK
valeur reste la même puis elle saute 4
. DENSE_RANK
attribue également le même rang aux trois lignes, mais la valeur distincte suivante se voit attribuer une valeur de 2.
Cet article couvre une relation intéressante entre
ROW_NUMBER()
etDENSE_RANK()
(laRANK()
fonction n'est pas traitée spécifiquement). Lorsque vous avez besoin d'un généréROW_NUMBER()
sur uneSELECT DISTINCT
instruction, leROW_NUMBER()
produira des valeurs distinctes avant qu'elles ne soient supprimées par leDISTINCT
mot - clé. Par exemple cette requête... pourrait produire ce résultat (
DISTINCT
sans effet):Alors que cette requête:
... produit ce que vous voulez probablement dans ce cas:
Notez que la
ORDER BY
clause de laDENSE_RANK()
fonction aura besoin de toutes les autres colonnes de laSELECT DISTINCT
clause pour fonctionner correctement.La raison en est que logiquement, les fonctions de fenêtre sont calculées avant d'
DISTINCT
être appliquées .Comparaison des trois fonctions
Utilisation de la syntaxe standard PostgreSQL / Sybase / SQL (
WINDOW
clause):... tu auras:
la source
Un peu:
Le rang d'une ligne est égal à un plus le nombre de rangs qui précèdent la ligne en question.
Row_number est le rang distinct des lignes, sans aucune lacune dans le classement.
http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile
la source
Requête simple sans clause de partition:
Production:
la source
Regardez cet exemple.
Insérez quelques données
Répéter les mêmes valeurs pour 1
Regardez tout
Regardez vos résultats
Besoin de comprendre les différents
la source
Faites également attention à ORDER BY dans PARTITION (Standard AdventureWorks db est utilisé par exemple) lors de l'utilisation de RANK.
Donne résultat:
SalesOrderID SalesOrderDetailID rank_same_as_partition rank_salesorderdetailid43659 1 1 1
43659 2 1 2
43 659 3 1 3
43 659 4 1 4
43 659 5 1 5
43 659 6 1 6
43 659 7 1 7
43 659 8 1 8
43659 9 1 9
43659 10 1 10
43659 11 1 11
43 659 12 1 12
Mais si vous modifiez l'ordre par à (utilisez OrderQty:
Donne:
SalesOrderID OrderQty rank_salesorderid rank_orderqty43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 2 1 7
43659 2 1 7
43659 3 1 9
43659 3 1 9
43659 4 1 11
43659 6 1 12
Notez comment le rang change lorsque nous utilisons OrderQty (deuxième table de la colonne la plus à droite) dans ORDER BY et comment il change lorsque nous utilisons SalesOrderDetailID (première table de la colonne la plus à droite) dans ORDER BY.
la source
Je n'ai rien fait avec rank, mais j'ai découvert cela aujourd'hui avec row_number ().
Cela entraînera la répétition des numéros de ligne car dans mon cas, chaque nom contient tous les éléments. Chaque article sera commandé en fonction du nombre vendu.
la source