大数据学习(126)-窗口函数范围
🍋🍋大数据学习🍋🍋
🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
在 SQL 中,窗口范围(Window Frame)通过 OVER
子句的 RANGE
、ROWS
或 GROUPS
关键字定义,用于确定聚合函数操作的数据子集。以下是详细解析:
核心语法
<聚合函数> OVER (PARTITION BY ...ORDER BY ...<窗口范围> -- 定义聚合的具体数据范围
)
窗口范围的三种模式
1. ROWS
模式
基于 物理行号 确定范围,不考虑值的差异。
ROWS BETWEEN <开始> AND <结束>
- 示例:
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW -- 当前行及其前3行(共4行) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 从第一行到当前行 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING -- 当前行+前一行+后一行(共3行)
2. RANGE
模式
基于 逻辑值范围 确定范围,适用于日期、数值等有序字段。
RANGE BETWEEN <开始> AND <结束>
示例(日期字段):
RANGE BETWEEN INTERVAL '7 DAY' PRECEDING AND CURRENT ROW -- 当前日期及前7天
RANGE BETWEEN 10 PRECEDING AND 10 FOLLOWING -- 当前值±10的范围(数值字段)
3. GROUPS
模式(较少使用)
基于 排序后的分组 确定范围,需配合 ORDER BY
使用。
GROUPS BETWEEN <开始> AND <结束>
示例:
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW -- 当前分组及其前一个分组
边界关键字详解
关键字 | 含义 | 适用模式 |
---|---|---|
UNBOUNDED PRECEDING | 从分区的第一行 / 第一个值开始 | ROWS 、RANGE |
UNBOUNDED FOLLOWING | 到分区的最后一行 / 最后一个值结束 | ROWS 、RANGE |
CURRENT ROW | 当前行 / 当前值 | 所有模式 |
N PRECEDING | 当前行 / 值的前 N 行 / 值(N 为数字) | 所有模式 |
N FOLLOWING | 当前行 / 值的后 N 行 / 值(N 为数字) | 所有模式 |
INTERVAL '...' PRECEDING | 当前日期 / 时间的前 N 个时间单位 | RANGE |
INTERVAL '...' FOLLOWING | 当前日期 / 时间的后 N 个时间单位 | RANGE |
常见组合示例
1. 计算移动平均值(7 天滚动)
AVG(amount) OVER (PARTITION BY user_idORDER BY order_dateRANGE BETWEEN INTERVAL '6 DAY' PRECEDING AND CURRENT ROW -- 近7天(含当天)
)
2. 累计求和(截至当前行)
SUM(amount) OVER (PARTITION BY user_idORDER BY order_dateROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 从第一行到当前行
)
3. 当前行及前后各一行
MAX(amount) OVER (ORDER BY order_dateROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING -- 共3行
)
模式选择建议
场景 | 推荐模式 | 示例 |
---|---|---|
按时间窗口聚合 | RANGE | RANGE BETWEEN INTERVAL '30 DAY' PRECEDING AND CURRENT ROW |
按固定记录数聚合 | ROWS | ROWS BETWEEN 9 PRECEDING AND CURRENT ROW (计算近 10 行的平均值) |
按分组聚合 | GROUPS | GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW (计算当前组及前两组) |
累计计算(从开始到当前) | ROWS | ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW |
注意事项
-
ORDER BY
必须存在:
RANGE
和GROUPS
模式依赖排序,若无ORDER BY
,窗口范围默认为UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
。 -
RANGE
的特殊规则:- 若排序字段有重复值,
RANGE
会将相同值视为同一窗口。例如:ORDER BY score -- 若两行 score 均为 80,它们的窗口范围相同
- 若排序字段有重复值,
-
默认窗口范围:
若省略窗口范围,SQL 默认使用:RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- 累计模式
总结
窗口范围的选择取决于业务需求:
- 时间 / 数值逻辑范围 →
RANGE
- 固定行数 →
ROWS
- 分组聚合 →
GROUPS