概述
窗口函数是一种SQL函数,其输入值是从SELECT语句结果集中的一个或多个“窗口”中获取所得。
窗口函数在一组与当前行相关的表行之间执行计算,这与使用聚合函数可以完成的计算类型类似。但与常规的聚合函数不同的是,使用窗口函数不会将行分组到单个输出行中——这些行保留它们各自的特性。
窗口函数与其他SQL函数的区别在于包含OVER子句。如果一个函数包含一个OVER子句,那么它就是一个窗口函数。如果它缺少OVER子句,则它是普通聚合或标量函数。
语法格式
sql
over_clause::=
analytic_function([ arguments ]) OVER (analytic_clause)
analytic_clause::=
[opt_win_parti] [opt_win_order] [opt_win_range]
opt_win_parti::=
PARTITION BY expr [, expr]...
opt_win_order::=
ORDER BY expr [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ]...
opt_win_range::=
{ ROWS | RANGE } { BETWEEN { UNBOUNDED PRECEDING | CURRENT ROW | value_expr { PRECEDING | FOLLOWING } } AND { UNBOUNDED FOLLOWING | CURRENT ROW | value_expr { PRECEDING | FOLLOWING } }
| { UNBOUNDED PRECEDING | CURRENT ROW | value_expr PRECEDING }
}
参数说明
analytic_function
:窗口函数的名称。arguments
:窗口函数的参数。OVER (analytic_clause)
:定义窗口的范围。
窗口规则
opt_win_parti
- 使用
PARTITION BY
子句根据一个或多个值(表字段)将查询结果集划分为多个组。如果省略此子句,则该函数将查询结果集的所有行作为单个组处理。 - 同一个查询中可指定多个分析函数,每个函数都具有相同或不同的
PARTITION BY
键。 - 如果要查询的对象具有Parallel属性,并且如果使用
opt_win_parti
指定一个分析函数,那么函数计算也将并行化。 opt_win_parti
参数的有效值是常量、列、非解析函数、函数表达式或涉及其中任何一个表达式的表达式。
opt_win_order
使用opt_win_order
指定分组内的数据排序方式。对于所有分析函数,可以将分组中的值按多个键排序,每个键由opt_win_order
参数定义,每个键定义一个排序序列。 使用opt_win_order
后多行生成相同的值时:
UME_DIST
、DENSE_RANK
、NTILE
、PERCENT_RANK
和RANK
对每一行返回相同的结果。ROW_NUMBER
为每一行分配一个不同的值,该值基于按opt_win_order
处理行的顺序,如果ORDER BY
不能保证总的顺序,则结果可能是不确定的。- 对于所有其他分析函数,结果取决于窗口规格。如果使用
RANGE
关键字指定一个逻辑窗口,那么该函数将为每一行返回相同的结果。如果使用ROWS关键字指定物理窗口,则结果是不确定的。
opt_win_order
使用时有如下限制:
在分析函数中使用时,opt_win_order
必须接受一个表达式expr
,位置Position
和列别名c_alias
是无效的。若使用位置或列别名,则opt_win_order
按照堆存储的排序返回结果。
使用RANGE
关键字的分析函数可以在其中使用多个排序键ORDER BY
子句,如果它指定了以下任何一个窗口:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
RANGE BETWEEN CURRENT ROW AND CURRENT ROW
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
在ORDER中,上述四个窗口边界之外的窗口边界只能有一个排序键,此限制不适用于ROWS
关键字指定的窗口边界。
opt_win_range
opt_win_range
指定ROWS
:value_expr
是物理偏移量,它必须是常量或值为非负数的表达式。- 若
value_expr
是起点的一部分,那它必须在终点之前对行求值。
opt_win_range
指定RANGE
:value_expr
是逻辑偏移量,它必须是常量或值为非负数的表达式、时间、INTERVAL时间值或文字常量。- 若
value_expr
值为一个数字,那opt_win_order
中的expr
必须为数字或时间类型。 - 若
value_expr
为一个间隔值,那opt_win_order
中的expr
必须是一个时间类型。