SQL RANK() 与 ROW_NUMBER()

标签 sql sql-server tsql

我对它们之间的差异感到困惑。运行以下 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

最佳答案

只有当您在特定排序值的分区内存在关联时,您才会看到差异。

在这种情况下,

RANKDENSE_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 值保持不变,然后跃升至 4DENSE_RANK 还会为所有三行分配相同的排名,但随后为下一个不同值分配值 2。

关于SQL RANK() 与 ROW_NUMBER(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7747327/

相关文章:

sql - 为什么这个查询在没有索引的情况下更快?

sql - SAP ABAP如何进行海量选型

sql - 使用 IF/ELSE IF 语句的奇怪错误

sql - 使用 t-sql 组合 'LIKE' 和 'IN'

java - 优化循环更新请求

c# - Sqlite 与 C# 和 where 子句

c# - 任务并行库和外部 SQL Server

sql-server - SQL Server 2005 连接错误 : Cannot generate SSPI context

mysql - SQL显示总销售额

vba - PostgreSQL/VBA : transaction block fail check or process