场景
传统的SQL
语句并不能支持诸如分组排名、滑动平均值等计算,GROUP BY
语句只能为每个分组的数据返回一行结果,而非每条数据一行。新版的SQL
标准引入了窗口查询功能,使用WINDOW
语句我们可以基于分区和窗口为每条数据都生成一行结果记录,这一标准也已得到了Hive的支持。窗口查询可应用在以下但不限于以下场景:
- 计算分组内TOP k
- 计算分组内排序
- 滑动窗口相关计算(滑动平均数等)
- 计算累计分布
- …
窗口定义
基本结构
从一个实际的sql入手
SELECT
`date`, `stock`, `close`
,AVG(`close`) OVER `w` AS `mavg`
FROM `t_stock`
WINDOW `w` AS (PARTITION BY `stock` ORDER BY `date` ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
-- 或者
SELECT
`date`, `stock`, `close`
,AVG(`close`) OVER (PARTITION BY `stock` ORDER BY `date` ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS `mavg`
FROM `t_stock`
其中(PARTITION BY `stock` ORDER BY `date` ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
是窗口的定义子句。
概念
窗口定义涉及了三个概念:窗口分区、窗口帧、以及窗口函数。