具有 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 窗口函数,使用先前计算的值的主要内容,如果未能解决你的问题,请参考以下文章