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