Window functions
Pollux 窗口函数可用于计算 SQL 窗口函数。
Understanding the window function definition
窗口函数对所有输入行进行操作。
每个窗口函数都可以理解为带有一个 OVER 子句,该子句指定了函数的求值方式:
function(args) OVER (
[PARTITION BY expression]
[ORDER BY expression [ASC|DESC]]
[frame]
)
框架是以下之一:
{RANGE|ROWS} frame_start
{RANGE|ROWS} BETWEEN frame_start AND frame_end
frame_start 和 frame_end 可以是以下任意一种:
UNBOUNDED PRECEDING
expression PRECEDING -- only allowed in ROWS mode
CURRENT ROW
expression FOLLOWING -- only allowed in ROWS mode
UNBOUNDED FOLLOWING
更多详情:
- PARTITION BY 字段将输入行分成不同的分区。
这类似于聚合函数将输入分成不同的组进行求值。
如果未指定 PARTITION BY 字段,则整个输入将被视为单个分区。
- ORDER BY 字段决定窗口函数处理输入行的顺序。
如果未指定 ORDER BY 字段,则顺序未定义。
- frame 子句指定函数针对给定输入行处理的行的滑动窗口。
frame 可以是 ROWS 类型或 RANGE 类型,其运行范围从 frame_start 到 frame_end。
如果未指定 frame_end,则使用默认值 CURRENT ROW。
在 ROWS 模式下,CURRENT ROW 指的是当前行。
在 RANGE 模式下,CURRENT ROW 指的是当前行的任意对等行。 如果行的 ORDER BY 字段值相同,则它们对等。 CURRENT ROW 的 frame 起始指的是当前行的第一个对等行, 而 CURRENT ROW 的 frame 结束指的是当前行的最后一个对等行。 如果未指定 ORDER BY,则所有行都被视为当前行的 对等行。
如果未指定 frame,则使用默认的 RANGE UNBOUNDED PRECEDING frame。
有关窗口框架的更多详细信息,请参阅window
SQL Example
窗口函数可用于执行以下 SQL 查询。 该查询按价格对每位店员的订单进行排序:
SELECT orderkey, clerk, totalprice,
rank() OVER (PARTITION BY clerk ORDER BY totalprice DESC) AS rnk
FROM orders ORDER BY clerk, rnk;
Ranking functions
cume_dist() -> bigint
返回一组值中某个值的累积分布。结果为窗口分区中,按窗口顺序排列的行数
在前或与该行对等的行数除以窗口分区的总行数。因此,排序中任何相同的值都将计算为相同的分布值。
dense_rank() -> bigint
返回一组值中某个值的排名。这与 rank() 类似,但平局值不会在序列中产生空位。
ntile(n) -> bigint
将每个窗口分区的行分成 n 个存储桶,每个存储桶的数值范围从 1 到最多“n”。存储桶值
最多相差 1。如果分区中的行数不能被存储桶数整除,则剩余值将从第一个存储桶开始,按每个存储桶分配一个。
例如,如果有 6 行和 4 个存储桶,则存储桶值将如下所示:“1 1 2 2 3 4”
percent_rank() -> double
返回某个值在一组值中的百分比排名。结果为 ``(r - 1) / (n - 1)``,其中 ``r`` 是该行的 ``rank()``,``n`` 是窗口分区中的总行数。
rank() -> bigint
返回一组值中某个值的排名。排名等于 1 加上该行之前不与该行对等的行数。因此,排序中的值会在序列中产生间隙。
排名针对每个窗口分区执行。
row_number() -> bigint
根据窗口分区内行的顺序,为每一行返回一个唯一的连续编号,从 1 开始。
Value functions
值函数提供了一个选项,用于指定在执行函数时如何处理空值。空值可以被忽略(IGNORE NULLS)或
被接受(RESPECT NULLS)。默认情况下,会接受空值。如果指定了IGNORE NULLS,则所有值表达式为空的行都将
从计算中排除。如果指定了“IGNORE NULLS”,并且所有行的值表达式都为空,则返回default_value;如果未指定,则返回null。
first_value(x) -> [same as input]
返回窗口的第一个值。
last_value(x) -> [same as input]
返回窗口的最后一个值。
nth_value(x, offset) -> [same as input]
返回距离窗口起始位置指定偏移量的值。偏移量从 1 开始。偏移量可以是任意标量表达式。如果
偏移量为 null 或大于窗口中值的数量,则返回 null。偏移量为零或负数会出错。
lag(x[, offset[, default_value]]) -> [same as input]
返回窗口分区中当前行之前 ``offset`` 行的值。
偏移量从 ``0``(即当前行)开始。默认 ``offset`` 为 ``1``。
偏移量可以是常量值或列引用。如果偏移量为 ``null``,则返回 ``null``。如果偏移量指向的行不
在分区内,则返回 ``default_value``;如果未指定 ``default_value``,则返回 ``null``。
如果指定了“IGNORE NULLS”,则在偏移量计数期间会忽略“null”值。
如果在偏移量计数期间未找到足够的非空值,则返回“default_value”。
lead(x[, offset[, default_value]]) -> [same as input]
返回窗口分区中当前行之后 ``offset`` 行的值。
偏移量从 ``0``(即当前行)开始。默认 ``offset`` 为 ``1``。
偏移量可以是常量值或列引用。如果偏移量为 ``null``,则返回 ``null``。如果偏移量指向不在分区内的行,
则返回 ``default_value``;如果未指定 ``default_value``,则返回 ``null``。
如果指定了 ``IGNORE NULLS``,则在偏移量计数期间忽略 ``null`` 值。
如果在偏移量计数期间未找到足够多的非空值,则返回 ``default_value``。
Aggregate functions
所有聚合函数都可以通过添加 OVER 子句用作窗口函数。聚合函数会针对当前行窗口框架内的每一行进行计算。