使用 lag() 或类似的开始和结束值的帐户汇总

问题描述 投票:0回答:0

我需要一个具有年度“begin_year”值的查询,一些计算以获得“end_year”值,然后 end_year 值成为下一条记录的 begin_year 值。

在这个简化的例子中,我每年只增加 10%。还有很多计算要做,我正在简化以专注于让 End_Year 成为下一年的 begin_year 值的任务......

Year   Begin Value    End Value
  1         100          110      (each end-value is a 10% increase from the begin value)
  2         110          121
  3         121          133.1
  4         133.1        146.4
 ... etc ...

我多次尝试让 Begin_Value 成为 End_value 的 lag() 会导致 catch-22,其中 end_value 未定义,因为它是在 BeginValue 定义之后定义的。当 begin 和 end 值相互依赖时,这似乎是不可能的?

(DatesAndNumbers 表只是一个包含记录 0、1、2、3、4...10 的表)

select dan.theNumber   the_year 
     , beginValue.amount as Begin_Balance
     , endValue.amount   as End_Balance
 from datesAndNumbers dan
  outer apply (
   select case when dan.theNumber =  0 then 100
               else lag(endValue.amount, 1, 100) over (order by dan.theNumber) 
          end amount 
  )  beginValue
  outer apply (
     select beginValue.amount * 1.10 as amount 
  )  endValue
where dan.theNumber between 0 and 10
order by dan.theNumber

我已经尝试了很多次,我希望在一个查询中做到这一点,而不是游标或 while 循环。仔细观察 lag() 以拉低先前记录的最终值,然而,最终值是根据开始值计算的,因此创建了似乎不可能的依赖关系。

这是 SQL Server 2018

sql recursion lag
© www.soinside.com 2019 - 2024. All rights reserved.