我有一些数据存在于一个我可以轻松选择的表中,我需要根据前一行的值计算每一行的输出值,但第一行除外,这是最初使用我在select查询中计算的值计算。我尝试了多次迭代的递归代码并使用了CTE但是我没有成功地让它工作。我正在疯狂地试图让它工作,我宁愿不运行循环,因为它需要很长时间才能完成。我们正在运行sql server 2012,我正在SSMS 2014中编写代码。
select 1 as rn, 1.5 x1, 2.5 x2, 2.0 x3, 45 y1, 42 y2, 43 ild into #x
union all
select 2 as rn, 1.7 x1, 2.2 x2, 2.1 x3, 55 y1, 12 y2, 43 ild
计算第一行的代码是
select x1*y1 + x2*y2 + x3 * ild from #x where rn = 1
计算第n行到第n行的代码是
select x1*y1 + x2*y2 + x3 * (previous row's calculated value)
请告诉我是否有遗漏的东西,因为我有8760行数据需要滚动57次(每个都是不同的数据集)并且循环速度不够快我需要它。
答案 0 :(得分:4)
这是一个递归的cte,但我不能说出87,000行的性能
;with cte as (
Select rn ,Calc = cast( x1*y1 + x2*y2 + x3 * ild as money) from #x Where rn=1
Union All
Select r.rn,cast(r.x1*r.y1 + r.x2*r.y2 + r.x3 * p.Calc as money)
From #x r
Join cte p on r.rn=p.rn+1
)
Select * from cte
Option (MAXRECURSION 0)
返回
rn Calc
1 258.50
2 662.75
我应该注意:我假设RN是增量的,没有间隙