SQL实现累计数据集末尾值顺延填充至当前日期的需求问题
以下是基于PostgreSQL语法的实现方案(你提供的测试数据使用了PostgreSQL特有的generate_series函数,适配性最好):
完整实现代码
WITH base_cumulative AS ( -- 计算原表历史数据的累计值 SELECT data_date, data_value, SUM(data_value) OVER (ORDER BY data_date) AS cumulative_value FROM test_table ), last_record AS ( -- 提取原表最新一条记录的核心信息 SELECT data_date AS max_date, data_value AS last_data_value, cumulative_value AS last_cumulative FROM base_cumulative ORDER BY data_date DESC LIMIT 1 ), fill_date_series AS ( -- 生成需要补全的日期序列:原表最大日期后1天 到 目标截止日期 SELECT generate_series( (SELECT max_date + INTERVAL '1 day' FROM last_record)::date, '2021-09-03'::date, -- 实际使用可替换为 CURRENT_DATE 自动取当前日期 '1 day' )::date AS data_date ) -- 合并历史数据与补全数据,计算最终累计值 SELECT data_date, data_value, SUM(data_value) OVER (ORDER BY data_date) AS cumulative_value FROM ( -- 历史数据部分 SELECT data_date, data_value FROM base_cumulative UNION ALL -- 补全数据部分:所有补全日期复用最后一条的数值 SELECT data_date, (SELECT last_data_value FROM last_record) AS data_value FROM fill_date_series ) t ORDER BY data_date;
逻辑说明
- 先通过
base_cumulative计算原始数据的历史累计值,对应你样例里的前7行累计结果 last_record取到原表最新日期的数值和累计值,作为后续填充的基准值fill_date_series生成需要补的连续日期,你可以把写死的截止日期换成CURRENT_DATE实现自动适配当前日期- 最后合并两部分数据,统一用窗口函数做累计求和,得到完整的顺延结果
如果你使用的是其他不支持generate_series的数据库,可以把生成日期序列的部分换成递归CTE实现,整体逻辑完全一致。
内容的提问来源于stack exchange,提问作者Daryn
相关产品推荐
相关产品推荐

