2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

9.22. 窗口函数 #

窗口函数提供了一种能力,可以在与当前查询行相关的行集上执行计算。有关此功能的介绍,请参阅第 3.5 节,有关语法细节,请参阅第 4.2.8 节

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

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

表 9.67. 通用窗口函数

函数

描述

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

返回窗口帧中第n行(从1开始计数)的value值;如果不存在这样的行,则返回NULL


表 9.67 中列出的所有函数都依赖于与相关窗口定义关联的ORDER BY子句指定的排序顺序。仅考虑ORDER BY列时,不重复的行被称为同级。四个排名函数(包括cume_dist)的定义方式是,它们对同级组中的所有行给出相同的结果。

请注意,first_valuelast_valuenth_value仅考虑窗口帧中的行,该帧默认包含从分区开始到当前行的最后一个同级行的所有行。对于last_value,有时对于nth_value,这可能会给出无用的结果。您可以通过在OVER子句中添加合适的帧规范(RANGEROWSGROUPS)来重新定义帧。有关帧规范的更多信息,请参阅第 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。同样,标准的FROM FIRSTFROM LAST选项对于nth_value也没有实现:仅支持默认的FROM FIRST行为。(您可以[::-end-of-string]通过反转ORDER BY排序来实现FROM LAST的结果。)

提交更正

如果您在文档中发现任何不正确、与您在使用特定功能时的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。