窗口函数 提供了在与当前查询行相关的行集合上执行计算的能力。 关于这个特性的介绍请参见 Section 3.5, 语法细节请参见 Section 4.2.8。
内置窗口函数列在
Table 9.67
中。
注意,
这些函数
必须使用窗口函数语法调用,
即需要一个
OVER
子句。
除了这些函数之外,
任何内置或用户定义的普通聚集
(即非有序集或假想集聚集)
都可以被用作窗口函数;
内置聚集的列表请参见
Section 9.21。
只有当一个
OVER
子句跟在调用之后时,
聚集函数才会作为窗口函数行动;
否则它们作为普通聚集行动,
并为整个集合返回一行。
Table 9.67. 通用窗口函数
Table 9.67
中列出的所有函数都依赖于相关窗口定义的
ORDER BY
子句所指定的排序顺序。
仅就
ORDER BY
列而言不区分彼此的行被称为
同级行。
四个排名函数
(包括
cume_dist)
的定义使得它们对同一对等组的所有行给出相同的答案。
注意,
first_value、
last_value 和
nth_value
只考虑
“窗口帧”内的行,
帧默认包含从分区的开始到当前行的最后一个同级行之间的行。
这对
last_value
很可能给出无用的结果,
对
nth_value
有时也是如此。
你可以通过在
OVER
子句中添加一个合适的帧说明
(RANGE、
ROWS 或
GROUPS)
来重新定义帧。
关于帧说明的更多信息,
请参见
Section 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
的效果。)