窗口函数 提供了跨越与当前查询行相关的行集执行计算的功能。有关此功能的介绍,请参见 第 3.5 节,有关语法详细信息,请参见 第 4.2.8 节。
内置窗口函数列在 表 9.65 中。请注意,这些函数 必须 使用窗口函数语法调用,即需要 OVER
子句。
除了这些函数之外,任何内置或用户定义的普通聚合函数(即,不是排序集或假设集聚合函数)都可以用作窗口函数;有关内置聚合函数的列表,请参见 第 9.21 节。聚合函数仅在调用之后有 OVER
子句时才充当窗口函数;否则它们充当普通聚合函数并为整个集合返回一行。
表 9.65. 通用窗口函数
在 表 9.65 中列出的所有函数都取决于与相关窗口定义的 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
选项未实现:只支持默认的 FROM FIRST
行为。(可以通过反转 ORDER BY
排序来实现 FROM LAST
的结果。)
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表格 报告文档问题。