🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 9.21\. 窗口函数 _窗口函数_提供跨行相关的当前查询行集执行计算的能力。 参阅[Section 3.5](#calibre_link-1330)获取这个特性的介绍。 [Table 9-48](#calibre_link-2162)列出了内建的窗口函数。 注意_必须_使用窗口函数的语法调用这些函数;一个`OVER`子句是必需的。 除了这些函数外,任何内建的或用户定义的聚集函数都可以作为窗口函数(见 [Section 9.20](#calibre_link-1641)关于内建聚集函数的列表)。 仅当调用跟着`OVER`子句的聚集函数,作为窗口函数;否则它们作为常规的聚合。 **Table 9-48\. 通用窗口函数** | 函数 | 返回类型 | 描述 | | --- | --- | --- | | `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。 | 在[Table 9-48](#calibre_link-2162)列出的所有函数, 依赖于与窗口定义有关的`ORDER BY`子句指定的排序。 _同行_是说在`ORDER BY`排序时不唯一的行。 定义的这四个排名函数,对于任何两个同行的答案相同。 注意`first_value`,`last_value`,和`nth_value` 只考虑"window frame"内的行,其默认情况下,包含从分区的开始行直到当前行的最后同行。 像`last_value`和`nth_value`有时会给出没有用的结果。 您可以通过向`OVER`子句添加合适的框架规范(`RANGE`或者`ROWS`) 来重新定义该框架。参阅[Section 4.2.8](#calibre_link-1331)获取框架定义的信息。 当一个聚集函数作为窗口函数使用时,将聚合超过当前行的窗框内的行。 一个使用`ORDER BY`和默认窗框定义处理"运行时求和"类型的行为的聚集函数, 可能不是想要的结果。为了获取超过整个分区聚合,忽略`ORDER BY` 或者使用`ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING`。 其它窗框规格可以用来获取其它的效果。 > **Note:** 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`的结果。)