【发布时间】:2021-06-11 07:00:54
【问题描述】:
我试图了解OVER() 窗口函数中的ORDER BY 子句与通用SQL 中的ORDER BY 子句有何不同。
我正在解决以下问题:https://www.pgexercises.com/questions/aggregates/nummembers.html
Produce a monotonically increasing numbered list of members (including guests),
ordered by their date of joining. Remember that member IDs are not guaranteed to be sequential.
以下查询是公认的解决方案之一:
SELECT COUNT(*) OVER(ORDER by joindate), firstname, surname FROM cd.members;
根据我的理解,由于我们没有在OVER() 函数中提供PARTITION BY 子句,所以cd.members 表中的所有行形成了一个大分区(我们称之为X)。当窗口函数运行时,它应该按joindate对X排序,然后X上的COUNT(*)会返回X中的行数,也就是cd.members中的行数。
但是这种理解是不正确的。伴随上述问题的“答案和讨论”指出:
由于我们定义了窗口函数的顺序,对于任何给定的行,窗口是:数据集的开始 -> 当前行。
PG documentation on window function 声明:
您还可以使用 OVER 中的 ORDER BY 来控制窗口函数处理行的顺序。 (窗口 ORDER BY 甚至不必匹配行的输出顺序。)
我无法理解的是为什么ORDER BY 会在当前行的OVER() 停止?您能否详细说明这是如何工作的?
感谢您的阅读。
【问题讨论】:
标签: postgresql sql-order-by window-functions