SQL RANK() 与 ROW_NUMBER()

新手上路,请多包涵

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

原文由 dotNET Hobbiest 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 647
2 个回答

ROW_NUMBER : 为从 1 开始的每一行返回一个唯一编号。对于具有重复值的行,编号是任意分配的。

Rank : 为从 1 开始的每一行分配一个唯一编号,但具有重复值的行除外,在这种情况下,分配相同的排名,并且每个重复排名的序列中都会出现一个间隙。

原文由 Ritesh Mengji 发布,翻译遵循 CC BY-SA 3.0 许可协议

请注意,所有这些窗口函数都返回一个类似整数的值。

通常数据库会选择 BIGINT 数据类型,这会占用比我们需要的更多的空间。而且,我们很少需要从 -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 的范围。

将结果转换为 BYTEINT、SMALLINT 或 INTEGER。

这些现代系统和硬件非常强大,因此您可能永远不会看到额外使用资源的意义,但我认为这是最佳实践。

原文由 Jacob Baumgartner 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进