窗口函数提供了在与当前查询行相关的行集上执行计算的能力。请参阅第 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
选项对于 nth_value
也未实现:仅支持默认的 FROM FIRST
行为。(您可以通过反转 ORDER BY
排序来实现 FROM LAST
的结果。)
如果您在文档中发现任何不正确、与您使用特定功能时的体验不符或需要进一步澄清的地方,请使用此表格报告文档问题。