我对它们之间的差异感到困惑。运行以下 SQL 会得到两个相同的结果集。有人可以解释一下这些差异吗?
SELECT ID, [Description], RANK() OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank' FROM SubStyle
SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle
最佳答案
只有当您在特定排序值的分区内存在关联时,您才会看到差异。
在这种情况下,RANK
和 DENSE_RANK
是确定性的,排序列和分区列具有相同值的所有行最终都会得到相同的结果,而 ROW_NUMBER
将任意(不确定地)将递增结果分配给绑定(bind)行。
示例:(所有行都具有相同的 StyleID
,因此位于同一分区中,并且在该分区内,按 ID< 排序时前 3 行是并列的
)
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
返回
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
您可以看到,对于 ROW_NUMBER
递增的三个相同行,RANK
值保持不变,然后跃升至 4
。 DENSE_RANK
还会为所有三行分配相同的排名,但随后为下一个不同值分配值 2。
关于SQL RANK() 与 ROW_NUMBER(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7747327/