求MySQL累加查询语句:按ID分组累加每日earnings字段值
解决MySQL分组累计收益求和问题
嘿,这需求我熟,就是要给每个Id计算从第一天到当前日期的累计收益对吧?下面给你两种实用的MySQL写法,适配不同版本的数据库:
方法一:使用窗口函数(MySQL 8.0+ 推荐)
这是最简洁高效的方式,利用MySQL 8.0新增的窗口函数直接实现分组滚动求和:
SELECT Id, record_date, earnings, SUM(earnings) OVER (PARTITION BY Id ORDER BY record_date) AS sum_of_earnings_per_day FROM 你的表名 -- 替换成实际表名 ORDER BY Id, record_date;
代码说明:
PARTITION BY Id:按Id将数据分组,确保只计算同一个Id下的累计值ORDER BY record_date:指定分组内的排序依据,保证按日期顺序累加SUM(earnings) OVER (...):窗口函数会自动计算当前组内从第一条记录到当前行的earnings总和
方法二:关联子查询(兼容MySQL 5.x及更早版本)
如果你的MySQL版本不支持窗口函数,可以用关联子查询实现相同效果:
SELECT t1.Id, t1.record_date, t1.earnings, (SELECT SUM(t2.earnings) FROM 你的表名 t2 WHERE t2.Id = t1.Id AND t2.record_date <= t1.record_date) AS sum_of_earnings_per_day FROM 你的表名 t1 ORDER BY t1.Id, t1.record_date;
代码说明:
- 通过自关联表,筛选出与当前行
Id相同且日期小于等于当前行的所有记录 - 对子查询中的
earnings求和,得到从第一天到当前日期的累计值
验证结果
用你提供的样例数据测试,两种方法都会返回符合预期的结果:
| Id | record_date | earnings | sum_of_earnings_per_day |
|---|---|---|---|
| 20977 | 2019-11-22 | -0.1737 | -0.1737 |
| 20977 | 2019-11-23 | -0.4867 | -0.6604 |
| 20977 | 2019-11-24 | 1.3961 | 0.7357 |
| 20977 | 2019-11-25 | -1.0450 | -0.3093 |
| 20977 | 2019-11-26 | 1.6639 | 1.3546 |
内容的提问来源于stack exchange,提问作者dev coding
相关产品推荐
相关产品推荐

