Skip to content

概述

窗口函数是一种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_DISTDENSE_RANKNTILEPERCENT_RANKRANK对每一行返回相同的结果。
  • 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必须是一个时间类型。