PostgreSQL 窗口函数参考
PostgreSQL 窗口函数提供了跨与当前行关联的分组的计算能力。 窗口函数与聚合函数不同,聚合函数对每个分组进行计算并为每个分组返回一行,而窗口函数不会将每个分组输出到一行,而是将每个分组的计算结果合并到与之关联的行中。
窗口函数都依赖于 OVER
子句, OVER
子句可用于行进行分组或组内排序。 窗口函数的调用语法如下:
window_function(args)
OVER (
[PARTITION BY partition_column_list]
[ORDER BY order_column_list]
)
这里:
window_function(args)
是需要调用的窗口函数以及它的参数。 除了特定的窗口函数,您还可以将聚合函数用在此处。PARTITION BY
指定需要分区的列名。它是可选的。默认为整个结果集为一个分区。ORDER BY
指定排序列名。它是可选的。
PostgreSQL 提供了很多窗口函数,可用于获取分区内的排名、序号、累积分布、桶排名等信息。
-
cume_dist
PostgreSQLcume_dist()
函数返回当前行的累积分布,即从第一行到与当前行值相同的最后一行的行数在分区内的总行数中的占比。 -
dense_rank
PostgreSQLdense_rank()
函数返回当前行所在的分区内的排名,从 1 开始,但没有间隔。 -
first_value
PostgreSQLfirst_value()
函数从当前行关联的窗口框架的第一行中返回评估的值。 -
lag
PostgreSQLlag()
函数返回来自当前行所在的分区内当前行之前的指定行之内的行的值。 -
last_value
PostgreSQLlast_value()
函数从当前行关联的窗口框架的最后一行中返回评估的值。 -
lead
PostgreSQLlead()
函数返回来自当前行所在的分区内当前行之后的指定行之内的值。 -
nth_value
PostgreSQLnth_value()
函数从当前行关联的窗口框架的指定的一行中返回评估的值。 -
ntile
PostgreSQLntile()
函数将当前行所在的分区内的所有行尽可能平均的分成指定数量的区间,并返回当前行所在的区间编号。 -
percent_rank
PostgreSQLpercent_rank()
函数返回当前行所在的分区内的相对排名,也就是(rank() - 1) / (分区总行数 - 1)
-
rank
PostgreSQLrank()
函数返回当前行所在的分区内的排名,从 1 开始,但有间隔。 -
row_number
PostgreSQLrow_number()
函数返回当前行所在的分区内的序号,从 1 开始。