【问题标题】:What does ORDER BY within OVER() window function mean in postgresql?OVER() 窗口函数中的 ORDER BY 在 postgresql 中是什么意思?
【发布时间】: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


【解决方案1】:

除了文档(您已经链接到的同一页面)已经说过的内容之外,我不知道要添加什么:

默认情况下,如果提供了 ORDER BY,则框架由所有 从分区开始到当前行的行,加上 根据 ORDER BY 子句。

我现在不认为这是 SQL 标准所要求的,但它确实看起来是合理的。如果您认为 ORDER BY 没有明显的效果,为什么还要指定它?

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 2015-09-25
    • 2011-03-12
    • 2020-01-30
    • 2016-12-14
    • 2019-12-10
    • 2017-12-22
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多