PostgreSQL 9.0.4 中文文档 | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 9. 函数和操作符 | Fast Forward | Next |
窗口函数提供跨的行相关的当前查询行集执行计算的能力。 见Section 3.5关于此功能的介绍。
Table 9-44列出了内建的窗口函数。注意必须使用窗口函数的语法调用这些函数; 一个OVER子句是必需的。
除了这些函数外,任何内建的或用户定义的聚合函数都可以作为窗口函数(见Section 9.18关于内建聚合函数的列表)。 仅当调用跟着OVER子句的聚合函数,作为窗口函数;否则它们作为常规的聚合。
Table 9-44. General-Purpose Window Functions
函数 | 返回类型 | 描述 |
---|---|---|
row_number()
| bigint | 在其分区中的当前行号,从1计 |
rank()
| bigint | 有间隔的当前行排名; 与row_number 同行之首相同 |
dense_rank()
| bigint | 没有间隔的当前行排名; 这个函数计数对等组。 |
percent_rank()
| double precision | 当前行的相对排名: (rank - 1) / (总行数 - 1) |
cume_dist()
| double precision | 当前行的相对排名: (前面的行数 或 与当前行同行)/(总行数) |
ntile(num_bucketsinteger)
| integer | 从1到参数值的整数范围,划分尽可能相等段。 |
lag(valueany
[,offsetinteger
[,defaultany]])
| 类型同value | 返回当前行的前offset行,value 的同一字段值。如果没有这样的行,返回default替代。 offset和default 都是当前行计算的结果。如果忽略了,则offset默认是1, default默认是 null。 |
lead(valueany
[,offsetinteger
[,defaultany]])
| 类型同value | 返回当前行的后offset行,value 的同一字段值。如果没有这样的行,返回default替代。 offset和default 都是当前行计算的结果。如果忽略了,则offset默认是1, default默认是 null。 |
first_value(valueany)
| 类型同value | 返回窗口第一行的value字段值。 |
last_value(valueany)
| 类型同value | 返回窗口最后一行的value字段值。 |
nth_value(valueany,nthinteger)
| 类型同value | 返回窗口第nth行的value 字段值(行从1计数);没有这样的行则 null。 |
在Table 9-44列出所有基于关联窗口定义ORDER BY指定排序子句的函数。 同行是说在ORDER BY排序时不唯一的行。定义的这四个排名函数,对于任何两个同行的答案相同。
注意first_value
,last_value
,和nth_value
只考虑内"window frame",其默认情况下,包含从分区的开始行直到当前行的最后同行。
像last_value
和nth_value
有时会给出没有用的结果。
You can redefine the frame by
adding a suitable frame specification (RANGEor
ROWS) to theOVERclause.
SeeSection 4.2.8for more information
about frame specifications.
当一个聚合函数作为窗口函数使用时,将聚合超过当前行的窗框内的行。 一个使用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的结果。)