↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4
开发快照。 PostgreSQL 20devel 尚未正式发布,内容仍可能变化。

9.23. 窗口函数 #

窗口函数提供了对与当前查询行相关的一组行执行计算的能力。该特性的介绍请参见第 3.5 节,语法细节请参见第 4.2.8 节。

内置的窗口函数列在表 9.68 中。注意,这些函数必须使用窗口函数语法调用,也就是说,需要一个 OVER 子句。

除了这些函数之外,任何内置的或用户定义的普通聚合(即不属于有序集或假想集聚合)都可以作为窗口函数使用;关于内置聚合的列表,参见第 9.22 节。聚合函数只有在调用后带有 OVER 子句时才作为窗口函数;否则,它们就是普通聚合,并为整个结果集返回一行。

表 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。


在表 9.68 中列出的所有函数都依赖于相关窗口定义的 ORDER BY 子句指定的排序顺序。仅考虑 ORDER BY 列时不能区分的行被称为是同等行。这四个排名函数(包括 cume_dist)的定义保证了它们对同一同等行组中的所有行给出相同的结果。

注意 first_value、last_value 和 nth_value 只考虑“窗口帧”内的行,它默认情况下包含从分区的开始行直到当前行的最后一个同等行。这对 last_value 可能不会给出有用的结果,有时对 nth_value 也一样。你可以通过向 OVER 子句增加一个合适的帧声明(RANGE、ROWS 或 GROUPS)来重定义帧。关于帧声明的更多信息请参考第 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。

注意

SQL 标准为 nth_value 定义了 FROM FIRST 或 FROM LAST 选项。这在 PostgreSQL 中没有实现:只支持默认的 FROM FIRST 行为。(你可以通过反转 ORDER BY 的排序达到 FROM LAST 的结果。)

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.