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;
代码说明
- 锚点成员直接定义起始年份(
theNumber=0)的期初值(100),并计算对应的期末值; - 递归成员通过
JOIN关联上一年的计算结果,将上年End_Balance直接作为本年Begin_Balance,再执行你的复杂运算得到本年End_Balance; - 若复杂运算需要引用
DatesAndNumbers表的其他字段,可直接在递归成员中调用dan表的对应列,完全适配自定义逻辑。
内容的提问来源于stack exchange,提问作者GaryPD
相关产品推荐
相关产品推荐

