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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:48:03