窗口函数提供了对与当前查询行相关的行集执行计算的能力。有关此功能的介绍,请参见第 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
的结果。)