窗口函数允许针对与当前查询行相关的行集执行计算。有关此功能的简介,请参见第 3.5 节,有关语法详细信息,请参见第 4.2.8 节。
内置窗口函数列于 表 9.65 中。请注意,必须使用窗口函数语法调用这些函数,即,需要 OVER
子句。
除了这些函数,任何内置或用户定义的普通聚合(即,不是有序集或假设集聚合)均可用作窗口函数;有关内置聚合的列表,请参见 第 9.21 节 。聚合函数仅在调用后带有 OVER
子句时才充当窗口函数;否则,它们充当普通聚合并为整个集合返回单行。
表 9.65。通用窗口函数
在 表 9.65 中列出的所有函数都依赖于相关窗口定义的 ORDER BY
子句指定的排序顺序。当仅考虑 ORDER BY
列时,重复的行称为对等项。四个排名函数(包括 cume_dist
)的定义方式使其对对等组的所有行给出相同答案。
请注意,first_value
、last_value
和 nth_value
仅考虑 “窗口框架” 内的行,默认情况下,该框架包含从分区开头到当前行的最后一个对等项的所有行。对 last_value
以及有时 nth_value
来说,这可能提供无用的结果。您可以通过向 OVER
子句添加合适的框架规范(RANGE
、ROWS
或 GROUPS
)重新定义框架。有关框架规范的详细信息,请参见 第 4.2.8 节。
当将聚合函数用作窗口函数时,它会对当前行的窗口框架内的行进行聚合。与 ORDER BY
和默认窗口框架定义一起使用的聚合会生成 “累加和” 类型的行为,这可能不是想要的结果。要对整个分区进行聚合,请省略 ORDER BY
或者使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
。可以使用其他框架规范来获取其他效果。
SQL 标准为 lead
、lag
、first_value
、last_value
和 nth_value
定义了 RESPECT NULLS
或 IGNORE NULLS
选项。这未在 PostgreSQL 中实现:其行为始终与标准的默认值 RESPECT NULLS
相同。类似地,该标准的 FROM FIRST
或 FROM LAST
选项未在 nth_value
中实现:仅支持默认的 FROM FIRST
行为。(您可以通过颠倒 ORDER BY
排序来实现 FROM LAST
的结果。)