【问题标题】:Understanding the relation between ranking functions, OVER(), GROUP BY?了解排名函数、OVER()、GROUP BY 之间的关系?
【发布时间】:2012-12-27 08:10:10
【问题描述】:

我的书是这么说的——

1- 排名函数(如 RANK()、DENSE_RANK()、ROW_NUMBER() 等)需要 OVER() 子句。

所以,下面的代码是错误的-

select *, RANK()
from [grant]
order by Amount desc

错误 - “RANK”附近的语法不正确,应为“OVER”。

如果我在上述代码中的 RANK() 之后添加 OVER(),我会再次收到错误消息。 (错误 - 排名函数“RANK”必须有 ORDER BY 子句。)

2- 然后,我的书补充说“排名函数需要 ORDER BY 信息才能作为参数出现在 OVER() 中”。

select *, RANK() OVER(ORDER BY Amount DESC) as GrantRank
from [grant]

我的问题是 -

1 - 为什么我们需要一个带有排名函数的 OVER() 子句? 2 - 为什么要去掉 order by 语句,放在 OVER() 里面?

这本书没有解释这些事情背后的逻辑!请帮助我理解它。

提前致谢。

【问题讨论】:

  • 只是一个警告:不要指望 SQL 的逻辑,尤其是它的语法。
  • @MarkHurd - 我不确定这是否是正确的方法。我相信这些事情背后一定有一些逻辑。否则的话,你可以把 c​​ount() 放在 rank() 里面,放在 add() 里面等等......只是说。
  • @MarkHurd - 我只是在想你说的话。如果在面试中问这些问题,你会说吗?
  • 我应该加一个笑脸:-) SQL 可以被理解,但是它的一些技术问题有点神秘。如果在采访中被问到这种问题,我会诚实地说我需要一些尝试和错误才能做到正确——当然在某个阶段我会检查手册(或者真的是谷歌)。

标签: sql sql-server-2008


【解决方案1】:

要了解发生了什么,您必须了解RANK 函数在做什么——它返回基于某些列的数据排名。对于那些并列的,您将获得相同的排名。因此,如果您想知道授权表中哪一行的金额最高,您需要按该特定列的降序排列。

想象一下任何运动中的排名——您可以让两支球队并列第一,而排名中的下一支球队将是第 3 名。这基本上就是RANK 函数正在为您做的事情。

这是MSDN上的一篇有用的文章。

这里是SQL Fiddle,也可能会有所帮助。

【讨论】:

  • 我认为您回答的问题略有不同。 :-)
  • @AaronBertrand -- 我只是重新看了看,是的,我以为他在问 ORDER BY 子句。愚蠢...谢谢并为此 +1。
【解决方案2】:

为什么我们需要一个带有排名功能的OVER() 子句?

OVER() 子句是必需的,以便 SQL Server 确切知道您希望如何确定 RANK() 之类的内容。如果您不向 SQL Server 提供订购标准,您会期待什么 RANK()?比赛的获胜者是时间最快、时间最慢还是按字母顺序排列名字的获胜者?

为什么我们要把order by语句去掉,放到OVER()里面?

OVER() 中添加ORDER BY 子句时,无需删除ORDER BY 子句。它们是独立使用的 - 一个用于确定 RANK(),另一个用于指示排序。

因此,例如,如果您想将比赛的完赛者归还,但将他们排在最后一位,您可能会说:

SELECT 
  name, 
  finish_time, 
  [rank] = RANK() OVER (ORDER BY finish_time) -- fastest first
FROM 
  dbo.race_table
ORDER BY 
  finish_time DESC; -- fastest last

【讨论】:

  • 谢谢。现在说得通了。我有一个微不足道的问题 - 为什么它被命名为 OVER()。所以,我查看了一个 Oracle SQL 问题 - stackoverflow.com/questions/1092120/over-clause-in-oracle 它说 - “OVER 子句指定了分析函数在其上运行的分区、排序和窗口。”这是我的小问题的答案吗?我不知道分区和解析函数是什么意思。
  • 将分区视为“切片”,将分析视为分析 - 例如,您可能想知道每个类别中得分最高的人。选择OVER() 这个词并不是微软做出的选择——他们尽可能地遵守 ANSI 标准。因此,您必须阅读标准或要求作者提供比您在其中一些答案中找到的更准确的解释。也就是说,“over which”对我来说听起来很合理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 2019-01-18
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多