窗口函数提供了对与当前查询行相关的一组行执行计算的能力。 该特性的介绍请参见Section 3.5,语法细节请参见Section 4.2.8。
内置的窗口函数列在Table 9.57中。注意,这些函数必须使用窗口函数语法调用,也就是说,需要一个OVER子句。
除了这些函数外,任何内置或用户定义的通用或统计聚合函数(即不属于有序集或假想集聚合的函数)都可以用作窗口函数;内置聚合函数列表见Section 9.20。聚合函数只有在调用后跟随 OVER 子句时才作为窗口函数;否则作为非窗口聚合,为整个集合返回一行。
Table 9.57. 通用窗口函数
在Table 9.57中列出的所有函数都依赖于相关窗口定义的ORDER BY子句指定的排序顺序。 仅考虑ORDER BY列时不能区分的行被称为是同等行。 定义的这四个排名函数(包括 cume_dist),对于同等行组的所有行的答案相同。
注意first_value、last_value和nth_value只考虑“窗口帧”内的行,它默认情况下包含从分区的开始行直到当前行的最后一个同等行。 这对last_value可能不会给出有用的结果,有时对nth_value也一样。 你可以通过向OVER子句增加一个合适的帧声明(RANGE、ROWS或GROUPS)来重定义帧。 关于帧声明的更多信息请参考Section 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的结果)。
cume_dist 计算分区中小于或等于当前行及其同等行的行所占的比例;percent_rank 则假设当前行不存在于分区中,计算分区中小于当前行的行所占的比例。