9.21. 窗口功能

窗口函数提供了跨与当前查询行相关的行集执行计算的功能。有关此功能的介绍,请参见Section 3.5,有关语法的详细信息,请参见Section 4.2.8

内置窗口功能在Table 9.57中列出。请注意,必须使用窗口函数语法来调用这些函数,即需要OVER子句。

除这些功能外,任何内置或用户定义的通用或统计聚合(即非有序集或假设集的聚合)都可以用作窗口函数;有关内置聚合的列表,请参见Section 9.20。仅当调用OVER子句时,聚合函数才充当窗口函数。否则,它们将充当非窗口聚合,并为整个集合返回一行。

表 9.57. 通用窗口功能

FunctionReturn TypeDescription
row_number()bigint分区中当前行的编号,从 1 开始计数
rank()bigint当前行的行距,有间隔;与第一个同位的row_number相同
dense_rank()bigint当前行的排名,没有差距;此功能计算对等组
percent_rank()double precision当前行的相对排名:(rank-1)/(总分区行-1)
cume_dist()double precision累 Integration 布:(在当前行之前或与之相邻的分区行数)/总分区行数
ntile(num_buckets integer)integer从 1 到参数值的整数,将分区尽可能平均地划分
lag(value anyelement [, offset integer [, default anyelement ]])same type as value返回* value *在分区中当前行之前的offset 行处求值;如果没有这样的行,则返回 default (其类型必须与 value *相同)。 * offset default 均针对当前行进行评估。如果省略, offset 默认为 1, default *默认为 null
lead(value anyelement [, offset integer [, default anyelement ]])same type as value返回* value *在分区中当前行之后的offset2 行处求值;如果没有这样的行,则返回 default (其类型必须与 value *相同)。 * offset default 均针对当前行进行评估。如果省略, offset 默认为 1, default *默认为 null
first_value(value any)same type as value返回* value *在作为窗口框架第一行的行上求值
last_value(value any)same type as value返回* value *在作为窗口框架最后一行的那一行求值
nth_value(value any, nth integer)same type as value返回* value *在窗口框的nth *行处计算(从 1 开始);如果没有这样的行,则返回 null

Table 9.57中列出的所有功能取决于关联窗口定义的ORDER BY子句指定的排序 Sequences。仅考虑ORDER BY列时没有区别的行称为* peers *。定义了四个排名函数(包括cume_dist),以便它们对所有对等行给出相同的答案。

请注意,first_valuelast_valuenth_value仅考虑“窗口框架”中的行,默认情况下,这些窗口包含从分区开始到当前行的最后一个对等方的行。这可能会给last_value有时甚至是nth_value带来不利的结果。您可以通过在OVER子句中添加合适的框架规范(RANGEROWSGROUPS)来重新定义框架。有关框架规格的更多信息,请参见Section 4.2.8

当将聚合函数用作窗口函数时,它将在当前行的窗口框架内的行上聚合。与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的 Sequences 来获得FROM LAST的结果.)

cume_dist计算小于或等于当前行及其对等行的分区行的分数,而percent_rank假设当前行不在分区中,则计算小于当前行的分区行的分数。