如何在SQL中按分组的Part Number填充Balance(余额)字段
纯SQL批量计算Balance方案
核心逻辑采用窗口聚合累加实现,无需逐行遍历计算,80万条数据通常几秒内即可完成计算,远高于逐行脚本的执行效率。
前提说明
- 假设每个
Part No分组内的行排序依据为ID字段(若有其他排序规则,替换下方SQL中ORDER BY ID部分即可) - 方案适用于支持窗口函数的主流数据库:MySQL 8.0+、PostgreSQL 9.4+、SQL Server 2012+、Oracle 11g+
- 无需用到已生成的
Previous Part No字段即可实现分组判断
可更新CTE数据库方案(SQL Server / PostgreSQL适用)
WITH balance_calc AS ( SELECT ID, "Current QOH" + SUM(Supply - Demand) OVER ( PARTITION BY "Part No" ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS calculated_balance FROM 你的表名 ) UPDATE 你的表名 t SET Balance = bc.calculated_balance FROM balance_calc bc WHERE t.ID = bc.ID;
MySQL 8.0+ 版本方案
UPDATE 你的表名 t JOIN ( SELECT ID, `Current QOH` + SUM(Supply - Demand) OVER ( PARTITION BY `Part No` ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS calculated_balance FROM 你的表名 ) bc ON t.ID = bc.ID SET t.Balance = bc.calculated_balance;
注意事项
- 执行更新前可先单独运行内层SELECT语句,验证计算结果是否符合预期,确认无误后再执行更新操作
- 可提前给
Part No、ID字段建立索引,进一步提升计算速度
内容的提问来源于stack exchange,提问作者Jim S
相关产品推荐
相关产品推荐

