You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明

  1. 先通过base_cumulative计算原始数据的历史累计值,对应你样例里的前7行累计结果
  2. last_record取到原表最新日期的数值和累计值,作为后续填充的基准值
  3. fill_date_series生成需要补的连续日期,你可以把写死的截止日期换成CURRENT_DATE实现自动适配当前日期
  4. 最后合并两部分数据,统一用窗口函数做累计求和,得到完整的顺延结果

如果你使用的是其他不支持generate_series的数据库,可以把生成日期序列的部分换成递归CTE实现,整体逻辑完全一致。

内容的提问来源于stack exchange,提问作者Daryn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:45:05