【发布时间】: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 - 我不确定这是否是正确的方法。我相信这些事情背后一定有一些逻辑。否则的话,你可以把 count() 放在 rank() 里面,放在 add() 里面等等......只是说。
-
@MarkHurd - 我只是在想你说的话。如果在面试中问这些问题,你会说吗?
-
我应该加一个笑脸:-) SQL 可以被理解,但是它的一些技术问题有点神秘。如果在采访中被问到这种问题,我会诚实地说我需要一些尝试和错误才能做到正确——当然在某个阶段我会检查手册(或者真的是谷歌)。
标签: sql sql-server-2008