使用窗口函数组织过滤数据
- 使用窗口函数组织过滤数据
- 窗口函数语法及参数
- 窗口函数建表示例
- 使用 AVG() 窗口函数
- 使用 COUNT() 窗口函数
- 使用 CUME_DIST() 窗口函数
- 使用 DENSE_RANK() 窗口函数
- 使用 FIRST_VALUE() 窗口函数
- 使用 LAST_VALUE() 窗口函数
- 使用 LAG() 窗口函数
- 使用 LEAD() 窗口函数
- 使用 MAX() 窗口函数
- 使用 MIN() 窗口函数
- 使用 NTILE() 窗口函数
- 使用 PERCENT_RANK() 函数
- 使用 RANK() 窗口函数
- 使用 ROW_NUMBER() 窗口函数
- 使用 QUALIFY 窗口函数
- 使用 SUM() 窗口函数
- 使用 VARIANCE, VAR_POP, VARIANCE_POP 窗口函数
- 使用 VAR_SAMP, VARIANCE_SAMP 窗口函数
- 使用 STD, STDDEV, STDDEV_POP 窗口函数
- 使用 STDDEV_SAMP 窗口函数
- 使用 COVAR_SAMP 窗口函数
- 使用 COVAR_POP 窗口函数
- 使用 CORR 窗口函数
本文介绍如何使用 StarRocks 窗口函数。
窗口函数是 StarRocks 内置的特殊函数。和聚合函数类似,窗口函数通过对多行数据进行计算得到一个数据值。不同的是,窗口函数使用 OVER() 子句对当前窗口内的数据进行排序和分组,同时对结果集的每一行计算出一个单独的值,而不是对每个 GROUP BY 分组计算一个值。这种灵活的方式允许您在 SELECT 子句中增加额外的列,对结果集进行重新组织和过滤。
窗口函数在金融和科学计算领域较为常用,常被用来分析趋势、计算离群值以及对大量数据进行分桶分析等。
窗口函数语法 及参数
语法
FUNCTION(args) OVER([partition_by_clause] [order_by_clause] [order_by_clause window_clause])
partition_by_clause ::= PARTITION BY expr [, expr ...]
order_by_clause ::= ORDER BY expr [ASC | DESC] [, expr [ASC | DESC] ...]
注意:窗口函数只能出现在 SELECT 列表和最外层的 ORDER BY 子句中。在查询过程中,窗口函数会在最后生效,也就是在执行完 Join,Where 和 GROUP BY 等操作之后生效。
参数说明
-
partition_by_clause:Partition By 子句。该子句将输入行按照指定的一列或多列分组,相同值的行会被分到一组。
-
order_by_clause:Order By 子句。与外层的 Order By 类似,Order By 子句定义了输入行的排列顺序,如果指定了 Partition By,则 Order By 定义了每个 Partition 分组内的顺序。与外层 Order By 的唯一不同在于,OVER() 子句中的
Order By n
(n
是正整数)相当于不做任何操作,而外层的Order By n
表示按照第n
列排序。以下示例展示了在 SELECT 列表中增加一个
id
列,它的值是1
,2
,3
等,顺序按照events
表中的date_and_time
列排序。SELECT row_number()
OVER (ORDER BY date_and_time)
AS id,
c1, c2, c3, c4
FROM events; -
window_clause:Window 子句,可以用来为窗口函数指定一个运算范围,以当前行为准,前后若干行作为窗口函数运算的对象。Window 子句支持的函数有:
AVG()
、COUNT()
、FIRST_VALUE()
、LAST_VALUE()
和SUM()
。对于MAX()
和MIN()
,Window 子句可以通过 UNBOUNDED、PRECEDING 关键词指定开始范围。Window 子句语法:
ROWS BETWEEN [ { m | UNBOUNDED } PRECEDING | CURRENT ROW] [ AND [CURRENT ROW | { UNBOUNDED | n } FOLLOWING] ]
注意:Window 子句必须在 Order By 子句之内。
窗口函数建表示例
本节创建的 scores
表将用于下面多个函数的示例。
CREATE TABLE `scores` (
`id` int(11) NULL,
`name` varchar(11) NULL,
`subject` varchar(11) NULL,
`score` int(11) NULL
)
DISTRIBUTED BY HASH(`score`) BUCKETS 10;
INSERT INTO `scores` VALUES
(1, "lily", "math", NULL),
(1, "lily", "english", 100),
(1, "lily", "physics", 60),
(2, "tom", "math", 80),
(2, "tom", "english", 98),
(2, "tom", "physics", NULL),
(3, "jack", "math", 95),
(3, "jack", "english", NULL),
(3, "jack", "physics", 99),
(4, "amy", "math", 80),
(4, "amy", "english", 92),
(4, "amy", "physics", 99),
(5, "mike", "math", 70),
(5, "mike", "english", 85),
(5, "mike", "physics", 85),
(6, "amber", "math", 92),
(6, "amber", NULL, 90),
(6, "amber", "physics", 100);