在数据分析场景里,滚动汇总和移动平均是最常用的时序计算方式。借助SQL中的窗口函数,我们不必再写复杂的自连接,只需要在聚合函数后加上over子句并定义滑动窗口,就能算出每一行对应的区间合计或均值。

什么是窗口函数中的滑动框架
窗口函数通过over(partition by 列 order by 列)确定计算范围。若要计算移动平均,还要用rows between来声明当前行的前后边界。例如rows between 2 preceding and current row表示包含当前行及前 two 行。
移动平均的实现示例
假设有每日销售额表daily_sales,字段为sale_date和amount,下面查询计算最近三天的移动平均:
select
sale_date,
amount,
avg(amount) over (
order by sale_date
rows between 2 preceding and current row
) as moving_avg_3d
from daily_sales
order by sale_date;
上述代码中,avg函数不再对整个表求和,而是按sale_date排序后,在每个当前行往前取两行做平均。若前面不足两行,则按实际行数计算。
滚动汇总写法
把avg换成sum即可得到滚动合计,例如最近七天的销售额汇总:
select
sale_date,
sum(amount) over (
order by sale_date
rows between 6 preceding and current row
) as sum_7d
from daily_sales
order by sale_date;
常见注意点
- order by是滑动窗口必须的条件,否则数据库无法确认行的前后顺序。
- 使用rows between时边界用preceding表示往前,following表示往后,unbounded preceding指开头。
- 如果按某个维度分组统计,可加上partition by customer_id之类的子句。
与自连接写法对比
| 方式 | 可读性 | 性能 |
|---|---|---|
| 自连接 | 差 | 随数据量下降明显 |
| 窗口函数 | 好 | 多数数据库有优化 |
可以看出,利用窗口函数计算移动平均和滚动汇总,既容易理解,也更容易被查询优化器处理。掌握over与rows between的组合,是写高效SQL的重要一步。