T-SQL使用CTE与窗口函数引用前序计算值解决Result字段NULL问题
你当前的写法无法实现需求,是因为普通非递归CTE中CASE N WHEN 1 THEN 100 END仅为第一行赋值,其余行默认返回NULL,且普通窗口函数只能读取源表的原始列值,无法引用同结果集中上一行计算得到的result动态值。
要实现逐行引用上一行计算结果的需求,需要使用递归CTE实现,修改后的完整SQL如下:
WITH cteA (N, val1) AS ( SELECT 1, 5.1 UNION SELECT 2, 6.5 UNION SELECT 3, 7.5 UNION SELECT 4, 4.6 UNION SELECT 5, 3.2 ), -- 预计算所有行的val2值(val1/上一行val1) cteVal2 AS ( SELECT N, val1, val1 / LAG(val1) OVER (ORDER BY N) AS val2 FROM cteA ), -- 递归CTE计算result cteResult AS ( -- 锚点成员:第一行result固定为100 SELECT N, val1, val2, CAST(100.0 AS DECIMAL(18,4)) AS result FROM cteVal2 WHERE N = 1 UNION ALL -- 递归成员:逐行计算,用上一行result * 当前行val2 SELECT v.N, v.val1, v.val2, CAST(r.result * v.val2 AS DECIMAL(18,4)) AS result FROM cteVal2 v INNER JOIN cteResult r ON v.N = r.N + 1 ) SELECT * FROM cteResult ORDER BY N -- 若数据行数超过100行,取消下一行注释解除递归次数限制 -- OPTION (MAXRECURSION 0)
执行后即可得到无NULL值的预期Result结果,数值精度可通过修改DECIMAL(18,4)的小数位参数调整。
内容的提问来源于stack exchange,提问作者nrc
相关产品推荐
相关产品推荐

