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


内容的提问来源于stack exchange,提问作者HackingWiz
相关产品推荐
相关产品推荐

