app_entity_240表基于id2分组重置Column C累计计算的SQL需求
修正后的SQL语句及问题分析
问题根源
原SQL存在三个核心问题:
- 未指定排序逻辑:MySQL不保证无
ORDER BY时的行顺序,累计求和的依赖顺序无法保障,结果不可靠。 - 变量处理逻辑错误:原代码中
@prev := id的赋值与判断顺序颠倒,且未针对id2进行分组判断。 - 分组累计未重置:当
id2变化时,未将累计变量@sum重置为0,导致不同组之间的累计值延续。
修正后的SQL
SELECT id2, id1, @sum := CASE WHEN @prev_id2 = id2 THEN @sum + `[3645]` ELSE 0 END AS `Column C`, @prev_id2 := id2 FROM ( -- 必须先按id2、id1排序,保证同组行的处理顺序正确 SELECT id2, id1, `[3645]` FROM app_entity_240 ORDER BY id2, id1 ) AS sorted_data CROSS JOIN ( SELECT @sum := 0, @prev_id2 := NULL ) AS params
逻辑说明
- 排序预处理:先将原表按
id2(分组标识)和id1(组内顺序标识)排序,确保每组内的行按正确顺序处理。 - 变量初始化:初始化累计变量
@sum为0,上一个分组标识@prev_id2为NULL,保证第一行触发重置逻辑。 - 分组累计判断:
- 若当前行
id2与上一行@prev_id2相同,则延续累计(@sum + [3645])。 - 若
id2发生变化,则重置累计值为0,开启新组的计算。
- 若当前行
验证结果
修正后的SQL会输出符合期望的结果:
| id 2 | id 1 | Column C |
|---|---|---|
| 1 | 1 | 0 |
| 1 | 2 | 100 |
| 1 | 3 | 200 |
| 2 | 4 | 0 |
| 2 | 5 | 200 |
| 2 | 6 | 300 |
内容的提问来源于stack exchange,提问作者Valdi Firmansyah
相关产品推荐
相关产品推荐

