PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 9. 函数和操作符 | 下一页

# 9.21. 窗口函数

窗口函数提供跨行相关的当前查询行集执行计算的能力。 参阅第 3.5 节获取这个特性的介绍， 参阅第 4.2.8 节获取语法细节。

表 9-53列出了内建的窗口函数。 注意必须使用窗口函数的语法调用这些函数；一个`OVER`子句是必需的。

除了这些函数外，任何内建的或用户定义的普通聚合函数（但不是顺序集或假想集聚合） 都可以作为窗口函数；参见第 9.20 节获取内建聚合函数的列表。 仅当调用跟着`OVER`子句的聚合函数，作为窗口函数；否则它们作为常规的聚合。

表 9-53. 通用窗口函数

函数 | 返回类型 | 描述
--- | --- | ---
`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` `any` [, `offset` `integer` [, `default` `any` ]])` | `类型同 `value`` | 计算分区当前行的前`offset` 行，返回`value` 。如果没有这样的行， 返回`default`替代。 `offset`和`default` 都是当前行计算的结果。如果忽略了，则`offset` 默认是1，`default`默认是 null。
`lead(`value` `any` [, `offset` `integer` [, `default` `any` ]])` | `类型同`value`` | 计算分区当前行的后`offset`行， 返回`value`。如果没有这样的行， 返回`default`替代。 `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-53列出的所有函数， 依赖于与窗口定义有关的`ORDER BY`子句指定的排序。 同行是说在`ORDER BY`排序时不唯一的行。 定义的这四个排名函数，对于任何两个同行的答案相同。

注意`first_value`，`last_value`，和`nth_value` 只考虑"window frame"内的行，其默认情况下，包含从分区的开始行直到当前行的最后同行。 像`last_value`和`nth_value`有时会给出没有用的结果。 您可以通过向`OVER`子句添加合适的框架规范（`RANGE`或者`ROWS`） 来重新定义该框架。参阅第 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`的结果。）

上一页 | 起始页 | 下一页
聚合函数 | 上一级 | 子查询表达式