带有 order by 的窗口函数返回奇怪的结果

use*_*521 1 postgresql window-functions

这是示例:

drop table if exists tst;

create table tst (
num integer not null
);

insert into tst values (1), (2), (3);

-- window functions WITH order by clause
select *, max(num) over (partition by true order by num asc), array_agg(num) over (partition by true order by num asc) as test
from tst;

-- window functions WITHOUT order by clause
select *, max(num) over (partition by true), array_agg(num) over (partition by true) as test
from tst;
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此处输入图片说明

为什么order by子句对聚合功能有影响?

a_h*_*ame 5

这是预期的。

用作窗口函数的聚合函数与 一起order by用作“滚动”聚合,即它仅考虑基于order by表达式的“当前行”的值。

从手册中引用

还有一个与窗口函数相关的重要概念:对于每一行,其分区内都有一组行,称为窗口框架。一些窗口函数只作用于窗框的行,而不是整个分区。默认情况下,如果提供 ORDER BY,则框架由从分区开始到当前行的所有行以及根据 ORDER BY 子句等于当前行的任何后续行组成。当省略 ORDER BY 时,默认框架由分区中所有行组成。

(强调我的)

有关更详细的解释,请参阅此答案