2

我的书说——

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() 中?

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

提前致谢。

4

2 回答 2

3

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

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

为什么我们必须删除 order by 语句并将其放在OVER()?

ORDER BY在. _ ORDER BY_ OVER()这些是独立使用的 - 一个用于确定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
于 2013-01-13T03:22:49.790 回答
0

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

想象一下任何一项运动的排名——你可以让两支球队并列第一,而排名中的下一支球队将是第三名。这基本上就是该RANK功能为您做的事情。

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

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

于 2013-01-13T03:23:03.077 回答