gpt4 book ai didi

SQL RANK() 与 ROW_NUMBER()

转载 作者:行者123 更新时间:2023-12-01 16:32:40 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com