SQL-Server递归查询

时间:2016-11-18 14:45:39

标签: sql-server

我有一些数据存在于一个我可以轻松选择的表中,我需要根据前一行的值计算每一行的输出值,但第一行除外,这是最初使用我在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次(每个都是不同的数据集)并且循环速度不够快我需要它。

1 个答案:

答案 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是增量的,没有间隙