9.22. 窗口函数 #
窗口函数提供了对与当前查询行相关的一组行执行计算的能力。该特性的介绍请参见第 3.5 节,语法细节请参见第 4.2.8 节。
内置的窗口函数列在表 9.64 中。注意,这些函数必须使用窗口函数语法调用,也就是说,需要一个 OVER 子句。
除了这些函数之外,任何内置的或用户定义的普通聚合(即不属于有序集或假想集聚合)都可以作为窗口函数使用;关于内置聚合的列表,参见第 9.21 节。聚合函数只有在调用后带有 OVER 子句时才作为窗口函数;否则,它们就是普通聚合,并为整个结果集返回一行。
表 9.64. 通用窗口函数
在表 9.64 中列出的所有函数都依赖于相关窗口定义的 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。同样,标准中用于 nth_value 的 FROM FIRST 或 FROM LAST 选项没有实现:只支持默认的 FROM FIRST 行为(你可以通过反转 ORDER BY 的排序达到 FROM LAST 的结果)。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.