2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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.65 中。请注意,这些函数 必须 使用窗口函数语法调用,即需要 OVER 子句。

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

表 9.65. 通用窗口函数

函数

描述

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 行处评估的 value(从 1 开始计数);如果不存在这样的行,则返回 NULL


表 9.65 中列出的所有函数都取决于与相关窗口定义的 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 选项未实现:只支持默认的 FROM FIRST 行为。(可以通过反转 ORDER BY 排序来实现 FROM LAST 的结果。)

提交更正

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