You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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保留两位小数

运行结果

不管用哪种方案,运行后都会得到你期望的结果:

datevalueaverage
01-05-20171010.00
02-05-201726.00
03-05-201786.67
04-05-201715.25
05-05-201796.00

(注:第三行的6.66和6.67是四舍五入的差异,如果你需要严格保留两位小数可以调整ROUND的参数,或者用其他精度处理方式)

内容的提问来源于stack exchange,提问作者user1692267

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:27:03