MySQL按日期查询并计算滚动平均值 新手技术求助
解决MySQL累积滚动平均值的问题
嘿,作为MySQL新手能想到用滚动平均来分析数据很棒!你需要的其实是累积滚动平均值——也就是从第一条记录开始,到当前日期为止所有value的平均值。下面分两种情况给你解决方案,适配不同版本的MySQL:
方案一:MySQL 8.0+(推荐,用窗口函数)
MySQL 8.0及以上版本支持窗口函数,这是实现这类需求最简洁高效的方式:
SELECT date, value, ROUND(AVG(value) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 2) AS average FROM my_table;
语句解释:
AVG(value) OVER (...):窗口函数,用来计算指定范围内的平均值ORDER BY date:确保按日期顺序计算,避免数据乱序导致结果错误ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:指定计算范围是从第一行(UNBOUNDED PRECEDING)到当前行,正好符合你要的累积平均需求ROUND(..., 2):把结果保留两位小数,和你期望的输出格式一致
方案二:MySQL 5.x版本(无窗口函数,用子查询)
如果你还在使用MySQL 5.x这类不支持窗口函数的版本,可以用子查询来实现:
SELECT t1.date, t1.value, ROUND((SELECT SUM(value) FROM my_table t2 WHERE t2.date <= t1.date) / (SELECT COUNT(*) FROM my_table t2 WHERE t2.date <= t1.date), 2) AS average FROM my_table t1 ORDER BY t1.date;
语句解释:
- 第一个子查询
(SELECT SUM(value) FROM my_table t2 WHERE t2.date <= t1.date):计算当前日期及之前所有value的总和 - 第二个子查询
(SELECT COUNT(*) FROM my_table t2 WHERE t2.date <= t1.date):计算当前日期及之前的记录数 - 两者相除得到平均值,再用
ROUND保留两位小数
运行结果
不管用哪种方案,运行后都会得到你期望的结果:
| date | value | average |
|---|---|---|
| 01-05-2017 | 10 | 10.00 |
| 02-05-2017 | 2 | 6.00 |
| 03-05-2017 | 8 | 6.67 |
| 04-05-2017 | 1 | 5.25 |
| 05-05-2017 | 9 | 6.00 |
(注:第三行的6.66和6.67是四舍五入的差异,如果你需要严格保留两位小数可以调整ROUND的参数,或者用其他精度处理方式)
内容的提问来源于stack exchange,提问作者user1692267
相关产品推荐
相关产品推荐

