选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.6 已于 2021 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

9.21. 窗口函数 #

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

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

除了这些函数外,任何内置或用户定义的普通聚合函数(但不含有序集聚合或假想集聚合)都可以用作窗口函数;内置聚合函数列表见第 9.20 节。聚合函数只有在调用后跟随 OVER 子句时才作为窗口函数;否则作为常规聚合。

表 9.56. 通用窗口函数

函数 返回类型 描述
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 相同)。offsetdefault 都针对当前行求值。如果省略,offset 默认为 1,default 默认为 null
lead(value anyelement [, offset integer [, default anyelement ]]) value 相同的类型 返回在分区内当前行之后 offset 行处计算的 value;如果没有这样的行,则返回 default(其类型必须与 value 相同)。offsetdefault 都针对当前行求值。如果省略,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.56中列出的所有函数都依赖于相关窗口定义的ORDER BY子句指定的排序顺序。 在ORDER BY排序中不能区分的行被称为是同等行; 这四个排名函数的定义使它们对任何两个同等行都给出相同的答案。

注意first_valuelast_valuenth_value只考虑窗口帧内的行,它默认情况下包含从分区的开始行直到当前行的最后一个同等行。 这对last_value可能不会给出有用的结果,有时对nth_value也一样。 你可以通过向OVER子句增加一个合适的帧声明(RANGEROWS)来重定义帧。 关于帧声明的更多信息请参考第 4.2.8 节

当一个聚合函数被用作窗口函数时,它将在当前行的窗口帧内的行上聚合。 一个使用ORDER BY和默认窗口帧定义的聚合产生一种累计求和类型的行为,这可能是或者不是想要的结果。 为了获取在整个分区上的聚合,省略ORDER BY或者使用ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。 其它窗口帧声明可以用来获得其它的效果。

注意

SQL 标准为leadlagfirst_valuelast_valuenth_value定义了一个RESPECT NULLSIGNORE NULLS选项。 这在PostgreSQL中没有实现:行为总是与标准的默认相同,即RESPECT NULLS。 同样,标准中用于nth_valueFROM FIRSTFROM LAST选项没有实现: 只支持默认的FROM FIRST行为(你可以通过反转ORDER BY的排序达到FROM LAST的结果)。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。