9.19. 窗口函数

窗口函数提供跨的行相关的当前查询行集执行计算的能力。 见Section 3.5关于此功能的介绍。

Table 9-44列出了内建的窗口函数。注意必须使用窗口函数的语法调用这些函数; 一个OVER子句是必需的。

除了这些函数外,任何内建的或用户定义的聚合函数都可以作为窗口函数(见Section 9.18关于内建聚合函数的列表)。 仅当调用跟着OVER子句的聚合函数,作为窗口函数;否则它们作为常规的聚合。

Table 9-44. General-Purpose Window Functions

函数返回类型描述
row_number() bigint 在其分区中的当前行号,从1计
rank() bigint 有间隔的当前行排名; 与row_number同行之首相同
dense_rank() bigint 没有间隔的当前行排名; 这个函数计数对等组。
percent_rank() double precision 当前行的相对排名: (rank- 1) / (总行数 - 1)
cume_dist() double precision 当前行的相对排名: (前面的行数 或 与当前行同行)/(总行数)
ntile(num_bucketsinteger) integer 从1到参数值的整数范围,划分尽可能相等段。
lag(valueany [,offsetinteger [,defaultany]]) 类型同value 返回当前行的前offset行,value 的同一字段值。如果没有这样的行,返回default替代。 offsetdefault 都是当前行计算的结果。如果忽略了,则offset默认是1, default默认是 null。
lead(valueany [,offsetinteger [,defaultany]]) 类型同value 返回当前行的后offset行,value 的同一字段值。如果没有这样的行,返回default替代。 offsetdefault 都是当前行计算的结果。如果忽略了,则offset默认是1, default默认是 null。
first_value(valueany) 类型同value 返回窗口第一行的value字段值。
last_value(valueany) 类型同value 返回窗口最后一行的value字段值。
nth_value(valueanynthinteger) 类型同value 返回窗口第nth行的value 字段值(行从1计数);没有这样的行则 null。

Table 9-44列出所有基于关联窗口定义ORDER BY指定排序子句的函数。 同行是说在ORDER BY排序时不唯一的行。定义的这四个排名函数,对于任何两个同行的答案相同。

注意first_valuelast_value,和nth_value 只考虑内"window frame",其默认情况下,包含从分区的开始行直到当前行的最后同行。 像last_valuenth_value有时会给出没有用的结果。 You can redefine the frame by adding a suitable frame specification (RANGEor ROWS) to theOVERclause. SeeSection 4.2.8for more information about frame specifications.

当一个聚合函数作为窗口函数使用时,将聚合超过当前行的窗框内的行。 一个使用ORDER BY和默认窗框定义处理"运行时求和"类型的行为, 可能不是想要的结果。为了获取超过整个分区聚合,忽略ORDER BY或者使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。 其它窗框规格可以用来获取其它的效果。

Note: SQL 标准为leadlagfirst_valuelast_valuenth_value定义了 一个RESPECT NULLSIGNORE NULLS可选项。 在PostgreSQL没有实现:行为总是与标准默认相同,即RESPECT NULLS。 同样用于nth_value的标准FROM FIRSTFROM LAST选项没有实现: 只有支持默认FROM FIRST行为。(你可以通过ORDER BY排序取反获取到FROM LAST的结果。)