带有窗口函数的查询
窗口表达式让应用开发者能够更轻松地使用标准 SQL 语句编写复杂的在线分析处理(OLAP)查询。例如,使用窗口表达式可以计算滑动平均值或区间总和,在特定列值发生变化时重置聚合和排名,以及用更简洁的方式表达复杂的比值计算逻辑。
窗口表达式表示将一个 <窗口函数>
应用于一个 <窗口帧>
,窗口帧通过 OVER()
子句定义。这类似于配合 GROUP BY
子句使用聚合函数进行的计算。不过与聚合函数为每个分组返回一个结果值不同,窗口函数会为每一 行返回一个结果值,这个结果是基于该行所属的窗口帧中所有行计算得出的。OVER()
子句可以将所有行划分为多个 分区,还可以进一步限制窗口帧的范围,指定当前行之前或之后哪些行应包含在计算中。
Apache Cloudberry 不支持将一个窗口函数作为另一个窗口函数的参数使用。
窗口表达式的语法如下:
<window_function> ( [<expression> [, ...]] ) [ FILTER ( WHERE <filter_clause> ) ] OVER ( <window_specification> )
其中 <window_function>
可以是用户定义的窗口函数,<expression>
是任意不包含窗口表达式的值表达式,<window_specification>
的结构如下:
[<window_name>]
[PARTITION BY <expression> [, ...]]
[[ORDER BY <expression> [ASC | DESC | USING operator] [NULLS {FIRST | LAST}] [, ...]
[ <frame_clause> ]
可选的 <frame_clause>
有以下两种形式:
{ RANGE | ROWS | GROUPS } <frame_start> [ <frame_exclusion> ]
{ RANGE | ROWS | GROUPS } BETWEEN <frame_start> AND <frame_end> [ <frame_exclusion> ]
其中 <frame_start>
和 <frame_end>
可以是以下选项之一:
UNBOUNDED PRECEDING
<offset> PRECEDING
CURRENT ROW
<offset> FOLLOWING
UNBOUNDED FOLLOWING
而 <frame_exclusion>
可以是以下选项之一:
EXCLUDE CURRENT ROW
EXCLUDE GROUP
EXCLUDE TIES
EXCLUDE NO OTHERS
窗口表达式只能出现在 SELECT
语句的查询列中。例如:
SELECT count(*) OVER(PARTITION BY customer_id), * FROM sales;