gpt4 book ai didi

sql - 了解排名函数、OVER()、GROUP BY 之间的关系?

转载 作者:行者123 更新时间:2023-12-04 05:15:45 25 4
gpt4 key购买 nike

我的书是这样说的-

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

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

提前致谢。

最佳答案

Why do we need to have an OVER() clause with a ranking function?

OVER() 子句是必需的,这样 SQL Server 才能准确知道您希望如何确定诸如 RANK() 之类的内容。如果您不为 SQL Server 提供排序标准,您期望什么 RANK()?比赛的获胜者是用时最快、用时最慢还是名字按字母顺序排列的获胜者?

Why do we have to remove the order by statement and put it inside the 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

关于sql - 了解排名函数、OVER()、GROUP BY 之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14300275/

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