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
的结果。)