SQL查询中如何实现带指定初始值的滚动累计求和?
需求实现方案
该需求完全可以在SQL中实现,以下是具体实现方法:
实现思路
- 先构造序号为0、变动值为0的初始行,和原表的数值行合并
- 取出NUMBERLIST表中的初始累计值
- 按SERIAL字段排序,对CHANGE字段做滚动累加,再加上初始值即可得到目标结果
标准SQL实现(支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL、Oracle、SQL Server等)
WITH base_data AS ( -- 合并初始行和原表数据 SELECT 0 AS SERIAL, 0 AS CHANGE UNION ALL SELECT SERIAL, CHANGE FROM `TABLE` ), initial_value AS ( -- 取累计初始值,假设NUMBERLIST仅返回一行结果,可根据业务加过滤条件 SELECT NUMBER AS init_num FROM NUMBERLIST ) SELECT SERIAL, CHANGE, (SELECT init_num FROM initial_value) + SUM(CHANGE) OVER (ORDER BY SERIAL ASC) AS CUMULATIVE FROM base_data ORDER BY SERIAL ASC;
老版本数据库实现(不支持窗口函数,如MySQL 5.x)
-- 先获取初始累计值 SET @init_num = (SELECT NUMBER FROM NUMBERLIST); -- 初始化累计变量 SET @cumulative = @init_num; SELECT SERIAL, CHANGE, @cumulative := @cumulative + CHANGE AS CUMULATIVE FROM ( SELECT 0 AS SERIAL, 0 AS CHANGE UNION ALL SELECT SERIAL, CHANGE FROM `TABLE` ) AS total_data ORDER BY SERIAL ASC;
以上两种写法执行后都会得到你需要的输出结果。
内容的提问来源于stack exchange,提问作者user2523167
相关产品推荐
相关产品推荐

