WINDOW 子句
Syntax
WindowClauseOptional
::= ( 'WINDOW' WindowDefinition ( ',' WindowDefinition )* )?
WindowDefinition
::= WindowName 'AS' WindowSpec
WindowSpec
::= '(' WindowSpecDetails ')'
WindowSpecDetails
::= [ExistingWindowName] [WindowUnionClause] WindowPartitionClause WindowOrderByClause WindowFrameClause [WindowExcludeCurrentTime] [WindowInstanceNotInWindow]
WindowUnionClause
:: = ( 'UNION' TableRefs)
WindowPartitionClause
::= ( 'PARTITION' 'BY' ByList )
WindowOrderByClause
::= ( 'ORDER' 'BY' ByList )
WindowFrameClause
::= ( WindowFrameUnits WindowFrameExtent [WindowFrameMaxSize])
WindowFrameUnits
::= 'ROWS'
| 'ROWS_RANGE'
WindowFrameExtent
::= WindowFrameStart
| WindowFrameBetween
WindowFrameStart
::= ( 'UNBOUNDED' | NumLiteral | IntervalLiteral ) ['OPEN'] 'PRECEDING'
| 'CURRENT' 'ROW'
WindowFrameBetween
::= 'BETWEEN' WindowFrameBound 'AND' WindowFrameBound
WindowFrameBound
::= WindowFrameStart
| ( 'UNBOUNDED' | NumLiteral | IntervalLiteral ) ['OPEN'] 'FOLLOWING'
WindowExcludeCurrentTime
::= 'EXCLUDE' 'CURRENT_TIME'
WindowInstanceNotInWindow
:: = 'INSTANCE_NOT_IN_WINDOW'窗口调用函数实现了类似于聚合函数的功能。 不同的是,窗口调用函数不需要将查询结果打包成一行输出—在查询输出中,每一行都是分开的。 然而,窗口调用函数可以扫描所有的行,根据窗口调用函数的分组规范(PARTITION BY列), 这些行可能会是当前行所在组的一部分。一个窗口调用函数的语法是下列之一:
SQL语句模版
ROWS WINDOW SQL模版
ROWS RANGE WINDOW SQL模版
边界说明
WINDOW Clause
Online Training 不支持
窗口子句用于定义一个或者若干个窗口。窗口可以是有名或者匿名的。用户可以在窗口上调用聚合函数来进行一些分析型计算的操作(sql agg_func() over window_name)。
OpenMLDB目前仅支持历史窗口,不支持未来窗口(即不支持FOLLOWING类型的窗口边界)。
OpenMLDB的窗口仅支持PARTITION BY列,不支持PARTITION BY运算或者函数表达式。
OpenMLDB的窗口仅支持ORDER BY列,不支持ORDER BY运算或者函数表达式。
在Online Serving时,需要遵循3.2 Online Serving下Window的使用规范
基本的WINDOW SPEC语法元素
Window Partition Clause 和 Window OrderBy Clause
PARTITION BY选项将查询的行分为一组进入partitions, 这些行在窗口函数中单独处理。PARTITION BY和查询级别GROUP BY 子句做相似的工作,除了它的表达式只能作为表达式不能作为输出列的名字或数。OpenMLDB要求必须配置PARTITION BY。并且目前仅支持按列分组,无法支持按运算和函数表达式分组。
ORDER BY 选项决定分区中的行被窗口函数处理的顺序。它和查询级别ORDER BY子句做相似的工作, 但是同样的它不能作为输出列的名字或数。同样,OpenMLDB要求必须配置ORDER BY。并且目前仅支持按列排序,无法支持按运算和函数表达式排序。
Window Frame Units
WindowFrameUnits定义了窗口的框架类型。OpenMLDB支持两类窗口框架:ROWS和ROWS_RANGE
SQL标准的RANGE类窗口OpenMLDB系统目前暂不支持。他们直接的对比差异如下图所示

ROWS: 窗口按行划入窗口,根据条数滑出窗口
ROWS_RANGE:窗口按行划入窗口,根据时间区间滑出窗口
RANGE: 窗口按时间粒度划入窗口(一次可能滑入多条同一时刻的数据行),按时间区间滑出窗口
Window Frame Extent
WindowFrameExtent定义了窗口的上界和下界。框架类型可以用 ROWS或ROWS_RANGE声明;
CURRENT ROW: 表示当前行
UNBOUNDED PRECEDING: 表示无限制上界
exprPRECEDING窗口类型为ROWS时,
expr必须为一个正整数。它表示边界为当前行往前expr行。窗口类型为ROWS_RANGE时,
expr一般为时间区间(例如10s,10m,10h,10d),它表示边界为当前行往前移expr时间段(例如,10秒,10分钟,10小时,10天)
OpenMLDB支持默认边界是闭合的。但支持OPEN关键字来修饰边界开区间
请注意:标准SQL中,还支持FOLLOWING的边界,当OpenMLDB并不支持。
Example: 有名窗口(Named Window)
Example: 匿名窗口
Example: ROWS窗口
Example: ROWS RANGE窗口
OpenMLDB特有的WINDOW SPEC元素
Window With Union
Example: Window with union 一张副表

Example: Window with union 多张副表

Example: Window with union 样本表不进入窗口

Example: Window with union 列筛选子查询
Window Exclude Current Time
Example: ROWS窗口EXCLUDE CURRENT TIME
Example: ROW RANGE窗口EXCLUDE CURRENT TIME

Window Frame Max Size
OpenMLDB在定义了元素,来限定窗口内条数。具体来说,可以在窗口定义里使用MAXSIZE关键字,来限制window内允许的有效窗口内最大数据条数。

Example: ROW RANGE 窗口MAXSIZE
Last updated