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

SQL使用LAG窗口函数实现前一行+当前行逐行累计计算求助

SQL逐行递归计算问题解决办法

问题核心

你需要实现Calculation列依赖自身上一行计算结果的逐行运算,这类场景属于递归累积计算。你之前用到的LAG(Data ingested, 1) OVER ( ORDER BY DATE ASC ) AS LAG只能获取前一行的Data ingested原始值,普通LAG窗口函数无法直接实现这类需求,因为LAG只能读取原始表中存储的静态字段值,无法读取计算过程中动态生成的上一行同列结果。

实现方案

使用递归公共表表达式(Recursive CTE)完成计算,适配MySQL 8.0+、PostgreSQL、SQL Server等绝大多数支持标准SQL的数据库,示例代码如下:

WITH RECURSIVE ranked_data AS (
    -- 给原始数据按日期排序加行号,方便递归时逐行匹配
    SELECT 
        *,
        ROW_NUMBER() OVER (ORDER BY DATE ASC) AS rn
    FROM 你的表名 -- 替换为实际表名
),
recursive_calc AS (
    -- 锚点部分:取第一行数据,Calculation初始值设为NULL,符合你对第一行的返回预期
    SELECT 
        DATE,
        `Data ingested`,
        CAST(NULL AS DECIMAL(18,2)) AS Calculation, -- 可根据实际计算结果类型调整
        rn
    FROM ranked_data
    WHERE rn = 1
    UNION ALL
    -- 递归部分:逐行关联上一行计算结果生成当前行的Calculation值
    SELECT 
        rd.DATE,
        rd.`Data ingested`,
        -- 此处替换为你实际的计算公式,rc.Calculation就是上一行的Calculation结果
        rc.Calculation + rd.`Data ingested` AS Calculation,
        rd.rn
    FROM ranked_data rd
    INNER JOIN recursive_calc rc ON rd.rn = rc.rn + 1
)
SELECT DATE, `Data ingested`, Calculation
FROM recursive_calc
ORDER BY DATE ASC;

原问题排查

你之前写LAG逻辑多返回一行的原因,是自关联时没有正确处理第一行的边界匹配,要么是左关联时生成了多余的空行,要么是过滤条件错误,用上述递归方案可以完全规避该问题,初始行返回值可完全按需自定义。

相关截图

calculation
数据示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:15:01