Postgresql 中文操作指南

9.22. Window Functions #

Window functions 能够对与当前查询行相关的行集执行计算。有关此功能的简介,请参阅 Section 3.5;有关语法详细信息,请参阅 Section 4.2.8

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

除了这些函数之外,还可以将任何内置或用户定义的普通聚合(即,不是有序集或假设集聚合)用作窗口函数;有关内置聚合的列表,请参阅 Section 9.21。仅当在调用后紧跟 OVER 子句时,聚合函数才作为窗口函数;否则,它们会作为普通聚合并为整个集合返回单行。

Table 9.64. General-Purpose Window Functions

Function

Description

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 ]] ) → anycompatible 返回在分区中当前行前 offset 行的行处计算的 value ;如果没有这样的行,则返回 default (类型必须与 value 兼容)。 offsetdefault 都根据当前行计算。如果省略,则 offset 默认值为 1, default 默认值为 NULL

lead ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible 返回在分区中当前行后 offset 行的行处计算的 value ;如果没有这样的行,则返回 default (类型必须与 value 兼容)。 offsetdefault 都根据当前行计算。如果省略,则 offset 默认值为 1, default 默认值为 NULL

first_value ( value anyelement ) → anyelement 返回窗口帧第一行中行的计算值 value

last_value ( value anyelement ) → anyelement 返回窗口帧最后一行中行的计算值 value

nth_value ( value anyelement , n integer ) → anyelement 返回 value ,它是在窗口框架的第 n 行(从 1 开始计数)处评估出来的;如果不存在这样的行,则返回 NULL

Table 9.64 中列出的所有函数都取决于关联窗口定义的 ORDER BY 子句指定的排序顺序。如果只考虑 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 标准定义了 RESPECT NULLSIGNORE NULLS 选项,用于 leadlagfirst_valuelast_valuenth_value。这没有在 PostgreSQL 中实现:行为始终与标准的默认行为相同,即 RESPECT NULLS。同样,标准的 FROM FIRSTFROM LAST 选项对于 nth_value 并未实现:仅支持默认 FROM FIRST 行为。(你可以通过反转 ORDER BY 顺序来实现 FROM LAST 的结果。)