窗口函数提供了一种能力,可以在与当前查询行相关的行集上执行计算。有关此功能的介绍,请参阅第 3.5 节,有关语法细节,请参阅第 4.2.8 节。
内置的窗口函数列在表 9.67中。请注意,这些函数必须使用窗口函数语法调用,即需要OVER子句。
除了这些函数之外,任何内置的或用户定义的普通聚合函数(即,不是有序集或假设集聚合函数)都可以用作窗口函数;有关内置聚合函数的列表,请参阅第 9.21 节。聚合函数仅在调用后面跟有OVER子句时才作为窗口函数;否则,它们将作为普通聚合函数,并为整个集合返回一行。
表 9.67. 通用窗口函数
表 9.67 中列出的所有函数都依赖于与相关窗口定义关联的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行为。(您可以[::-end-of-string]通过反转ORDER BY排序来实现FROM LAST的结果。)