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

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 11 已结束支持。 2023-11-09. 请参阅 当前版本手册.

9.21. 窗口函数 #

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

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

除了这些函数外,任何内置或用户定义的通用或统计聚合函数(即不属于有序集或假想集聚合的函数)都可以用作窗口函数;内置聚合函数列表见第 9.20 节。聚合函数只有在调用后跟随 OVER 子句时才作为窗口函数;否则作为非窗口聚合,为整个集合返回一行。

表 9.57. 通用窗口函数

函数返回类型描述
row_number()bigint当前行在其分区内的编号,从 1 开始计数
rank()bigint当前行的排名,允许空缺;等于其第一个同等行的 row_number
dense_rank()bigint当前行的排名,没有空缺;此函数对同等行组计数
percent_rank()double precision当前行的相对排名:(rank - 1)/(分区总行数 - 1)
cume_dist()double precision累积分布:(分区中位于当前行之前或与之同等的行数)/ 分区总行数
ntile(num_buckets integer)integer范围为 1 到参数值的整数,将分区尽可能均等地划分
lag(value anyelement [, offset integer [, default anyelement ]]) 与 value 相同的类型返回在分区内当前行之前 offset 行处计算的 value;如果没有这样的行,则返回 default(其类型必须与 value 相同)。offset 和 default 都针对当前行求值。如果省略,offset 默认为 1,default 默认为 null
lead(value anyelement [, offset integer [, default anyelement ]]) 与 value 相同的类型返回在分区内当前行之后 offset 行处计算的 value;如果没有这样的行,则返回 default(其类型必须与 value 相同)。offset 和 default 都针对当前行求值。如果省略,offset 默认为 1,default 默认为 null
first_value(value any)与 value 相同的类型返回在窗口帧第一行处计算的 value
last_value(value any)与 value 相同的类型返回在窗口帧最后一行处计算的 value
nth_value(value any, nth integer) 与 value 相同的类型返回在窗口帧第 nth 行处计算的 value(从 1 开始计数);没有这样的行时返回 null

在表 9.57 中列出的所有函数都依赖于相关窗口定义的 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。其它窗口帧声明可以用来获得其它的效果。

注意

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

cume_dist 计算分区中小于或等于当前行及其同等行的行所占的比例;percent_rank 则假设当前行不存在于分区中,计算分区中小于当前行的行所占的比例。

报告文档问题

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