具有 CTE 的 T-SQL 窗口函数,使用先前计算的值

Posted

技术标签:

【中文标题】具有 CTE 的 T-SQL 窗口函数,使用先前计算的值【英文标题】:T-SQL Window Functions with CTE, use previously computed value 【发布时间】:2021-11-13 20:12:03 【问题描述】:

我尝试使用以下 CTE 查询计算 Result 字段中引用先前 Result 值的值:

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
), cteB AS (
    SELECT *
        , val1 / LAG(val1) OVER (ORDER BY N) val2
        , (CASE N WHEN 1 THEN 100 END) result
    FROM cteA
)

SELECT *
FROM cteB

它在 Result 字段上返回意外的 NULL 值:

https://i.stack.imgur.com/oeMcO.png

我需要帮助来获取预期值而不是 NULLs,如下所示:

https://i.stack.imgur.com/XprEW.png

【问题讨论】:

根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 【参考方案1】:

你需要使用递归cte

with
cteR AS
(
    SELECT  N, val1, 
            val2   = convert(decimal(20,4), NULL), 
            result = convert(decimal(20,4), 100)
    FROM    cteA
    WHERE   N   = 1

    UNION ALL

    SELECT  a.N, a.val1, 
            val2   = convert(decimal(20,4), a.val1 / r.val1), 
            result = convert(decimal(20,4), a.val1 / r.val1 * r.result)
    FROM    cteR r
            INNER JOIN cteA a   on  r.N = a.N - 1

)
SELECT  *
FROM    cteR

【讨论】:

以上是关于具有 CTE 的 T-SQL 窗口函数,使用先前计算的值的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL使用CTE递归

T-SQL 之 公用表表达式(CTE)

使用(递归?)CTE + 窗口函数将销售订单归零?

H2 数据库:在 CTE 中使用窗口函数时出错

如何在T-SQL中使用递归CTE获得完整的层次结构?

T-SQL:CTE用法