使用窗口函数可计算累计和与移动平均值,SUM()和AVG()结合OVER()子句按排序或分组实现累积计算,如按产品分组的累计收入和3日移动平均。

在 SQL 中,计算累计和与平均值主要依赖窗口函数(Window Functions),它们可以在不改变原始行数的情况下,对数据进行分组、排序并执行累积计算。
累计和(Running Total)
使用 SUM() 窗口函数结合 OVER() 子句可以实现累计和。关键在于定义排序顺序,确保累计按预期进行。
语法示例:
SUM(列名) OVER (ORDER BY 排序列)如果需要按某一维度(如用户、部门)分别计算累计和,则加入 PARTITION BY:
SUM(金额) OVER (PARTITION BY 用户ID ORDER BY 日期)这表示:每个用户的金额按日期顺序逐行累加。
移动平均值(Moving Average)
平均值可通过 AVG() 窗口函数实现。与 SUM 类似,结合 OVER() 可计算累计平均或指定范围的移动平均。
计算每个记录的累计平均值:
AVG(数值) OVER (ORDER BY 时间戳 ROWS UNBOUNDED PRECEDING)若要计算最近 3 行的移动平均(含当前行),使用:
AVG(数值) OVER (ORDER BY 时间戳 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)实际应用示例
假设有一张销售表 sales,包含字段:date, product, revenue。想查看每个产品每日收入的累计和与 3 日移动平均:
date,
product,
revenue,
SUM(revenue) OVER (PARTITION BY product ORDER BY date) AS running_total,
AVG(revenue) OVER (PARTITION BY product ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM sales;
结果中每行保留原始数据,同时附加两个计算列:累计收入和近期平均收入。
基本上就这些。掌握 OVER() 中的 ORDER BY 和 ROWS 定义是关键,能灵活控制累计与滑动计算的范围。










