此文档适用于不受支持的 PostgreSQL 版本。
您可能需要查看
当前版本的相同页面,或上面列出的其他受支持版本。
窗口函数提供了对与当前查询行相关的一组行执行计算的能力。 该特性的介绍请参见Section 3.5,语法细节请参见Section 4.2.8。
内置的窗口函数列在Table 9.68中。注意,这些函数必须使用窗口函数语法调用,也就是说,需要一个OVER子句。
除了这些函数之外,任何内置的或用户定义的普通聚合(例如非有序集或假想集聚合)都可以作为窗口函数使用;关于内置聚合的列表,参见Section 9.22。 聚合函数只有在调用后带有OVER子句时才作为窗口函数;否则,它们就是普通聚合,并为整个结果集返回一行。
Table 9.68. 通用窗口函数
|
函数
描述
|
|
row_number () → bigint
返回其分区内的当前行数,从1开始计数。
|
|
rank () → bigint
返回当前行的排名,包含间隔;即平级组中第一行的row_number。
|
|
dense_rank () → bigint
返回当前行的排名,不包括间隔;这个功能有效地计数平级组。
|
|
percent_rank () → double precision
返回当前行的相对排名,即(rank - 1) / (总的分区行数 - 1)。因此,该值的范围从0到1(包含在内)。
|
|
cume_dist () → double precision
返回累积分布,也就是(当前行之前或对等的分区行数)/(总的分区行数)。取值范围为1/N 到 1。
|
|
ntile ( num_buckets integer ) → integer
返回一个从1到参数值的整数,并将分区划分为尽可能相等的值。
|
|
lag ( value anycompatible [, offset integer [, default anycompatible ]] ) [ null treatment ] → anycompatible
返回分区中在当前行之前offset行的value;如果没有这样的行,则返回default(必须与value相兼容的类型)。 offset和default都是针对当前行求值的。 如果省略,offset默认为1,default为NULL。
|
|
lead ( value anycompatible [, offset integer [, default anycompatible ]] ) [ null treatment ] → anycompatible
返回分区中在当前行之后offset行的value; 如果没有这样的行,则返回default(必须与value兼容的类型)。 offset和default都是针对当前行求值的。 如果省略,offset默认为1,default为NULL。
|
|
first_value ( value anyelement ) [ null treatment ] → anyelement
返回在窗口帧的第一行求得的value。
|
|
last_value ( value anyelement ) [ null treatment ] → anyelement
返回在窗口帧的最后一行求得的value。
|
|
nth_value ( value anyelement, n integer ) [ null treatment ] → anyelement
返回在窗口帧的第n行求得的value(从1开始计数);如果没有这样的行,则返回NULL。
|
在Table 9.68中列出的所有函数都依赖于相关窗口定义的ORDER BY子句指定的排序顺序。 仅考虑ORDER BY列时不能区分的行被称为是同等行。 定义的这四个排名函数(包括 cume_dist),对于平级组的所有行的答案相同。
注意first_value、last_value和nth_value只考虑“窗口帧”内的行,它默认情况下包含从分区的开始行直到当前行的最后一个同等行。 这对last_value可能不会给出有用的结果,有时对nth_value也一样。 你可以通过向OVER子句增加一个合适的帧声明(RANGE或GROUPS)来重定义帧。 关于帧声明的更多信息请参考Section 4.2.8。
当一个聚合函数被用作窗口函数时,它将在当前行的窗口帧内的行上聚合。 一个使用ORDER BY和默认窗口帧定义的聚合产生一种“运行时求和”类型的行为,这可能是或者不是想要的结果。 为了获取在整个分区上的聚合,忽略ORDER BY或者使用ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。 其它窗口帧声明可以用来获得其它的效果。
null treatment 选项必须是以下之一:
RESPECT NULLS
IGNORE NULLS
如果未指定,默认值是RESPECT NULLS,它会在任何结果计算中包含 NULL 值。IGNORE NULLS 会忽略 NULL 值。此选项只允许用于以下函数:lag、lead、first_value、last_value、nth_value。
Note
SQL 标准为nth_value定义了FROM FIRST或FROM LAST选项。这在PostgreSQL中没有实现:只支持默认的FROM FIRST行为。(你可以通过反转ORDER BY的排序达到FROM LAST的结果。)