PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

9.22. 窗口函数 #

窗口函数 提供了在与当前查询行相关的行集合上执行计算的能力。 关于这个特性的介绍请参见 Section 3.5, 语法细节请参见 Section 4.2.8。

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

除了这些函数之外, 任何内置或用户定义的普通聚集 (即非有序集或假想集聚集) 都可以被用作窗口函数; 内置聚集的列表请参见 Section 9.21。 只有当一个 OVER 子句跟在调用之后时, 聚集函数才会作为窗口函数行动; 否则它们作为普通聚集行动, 并为整个集合返回一行。

Table 9.67. 通用窗口函数

函数

说明

row_number () → bigint

返回当前行在其分区内的行号, 从 1 开始计数。

rank () → bigint

返回当前行的排名 (带空隙); 也就是说, 为它的对等组中第一行的 row_number。

dense_rank () → bigint

返回当前行的排名 (不带空隙); 这个函数有效地统计对等组的数量。

percent_rank () → double precision

返回当前行的相对排名, 即 (rank - 1) / (total partition rows - 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 兼容的类型)。 offset 和 default 都是相对于当前行求值的。 如果省略, offset 默认为 1, default 默认为 NULL。

lead ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible

返回在分区内位于当前行之后 offset 行的那一行上求值的 value; 如果没有这样的行, 则返回 default (它必须是与 value 兼容的类型)。 offset 和 default 都是相对于当前行求值的。 如果省略, offset 默认为 1, default 默认为 NULL。

first_value ( value anyelement ) → anyelement

返回在作为窗口帧第一行的那一行上求值的 value。

last_value ( value anyelement ) → anyelement

返回在作为窗口帧最后一行的那一行上求值的 value。

nth_value ( value anyelement, n integer ) → anyelement

返回在作为窗口帧第 n 行 (从 1 开始计数) 的那一行上求值的 value; 如果没有这样的行, 则返回 NULL。


Table 9.67 中列出的所有函数都依赖于相关窗口定义的 ORDER BY 子句所指定的排序顺序。 仅就 ORDER BY 列而言不区分彼此的行被称为 同级行。 四个排名函数 (包括 cume_dist) 的定义使得它们对同一对等组的所有行给出相同的答案。

注意, first_value、 last_value 和 nth_value 只考虑 “窗口帧”内的行, 帧默认包含从分区的开始到当前行的最后一个同级行之间的行。 这对 last_value 很可能给出无用的结果, 对 nth_value 有时也是如此。 你可以通过在 OVER 子句中添加一个合适的帧说明 (RANGE、 ROWS 或 GROUPS) 来重新定义帧。 关于帧说明的更多信息, 请参见 Section 4.2.8。

当一个聚集函数被用作窗口函数时, 它会聚合当前行的窗口帧内的行。 一个与 ORDER BY 以及默认窗口帧定义一起使用的聚集, 会产生一种 “运行总计”式的行为, 这可能是也可能不是你想要的。 要获得对整个分区的聚合, 可以省略 ORDER BY 或使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。 其他帧说明可以用来获得其他效果。

Note

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 的效果。)