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

SQL Server 2018中用lag()实现期初值承接上年期末值的滚动计算

解决年度期初/期末值循环依赖的单查询方案(SQL Server 2018)

你遇到的循环依赖问题,本质是同一查询中LAG()函数无法引用还未计算出的End_Balance值。要实现下年期初承接上年期末的计算,递归CTE是最适合的单查询解决方案,无需游标或循环。

核心思路

递归CTE分为两部分实现迭代计算:

  • 锚点成员:初始化第一年的期初值与期末值
  • 递归成员:逐行迭代后续年份,直接用上一年的期末值作为本年的期初值,再执行自定义运算得到本年期末值

完整查询代码

WITH YearlyBalances AS (
    -- 锚点成员:初始化起始年份的数值
    SELECT 
        dan.theNumber AS the_year,
        CAST(100 AS DECIMAL(18,2)) AS Begin_Balance,
        CAST(100 * 1.10 AS DECIMAL(18,2)) AS End_Balance
    FROM DatesAndNumbers dan
    WHERE dan.theNumber = 0

    UNION ALL

    -- 递归成员:迭代后续年份,承接上年期末值
    SELECT 
        dan.theNumber AS the_year,
        yb.End_Balance AS Begin_Balance,
        -- 替换此处为你的实际复杂运算逻辑
        CAST(yb.End_Balance * 1.10 AS DECIMAL(18,2)) AS End_Balance
    FROM DatesAndNumbers dan
    JOIN YearlyBalances yb ON dan.theNumber = yb.the_year + 1
    WHERE dan.theNumber BETWEEN 1 AND 10
)
SELECT the_year, Begin_Balance, End_Balance
FROM YearlyBalances
ORDER BY the_year;

代码说明

  1. 锚点成员直接定义起始年份(theNumber=0)的期初值(100),并计算对应的期末值;
  2. 递归成员通过JOIN关联上一年的计算结果,将上年End_Balance直接作为本年Begin_Balance,再执行你的复杂运算得到本年End_Balance;
  3. 若复杂运算需要引用DatesAndNumbers表的其他字段,可直接在递归成员中调用dan表的对应列,完全适配自定义逻辑。

内容的提问来源于stack exchange,提问作者GaryPD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:12:18