2016-11-18 102 views
5

我有一些数据驻留在表中,我可以轻松地从中进行选择,并且需要根据前一行的值计算每行的输出值,但第一行除外使用我在初始选择查询中计算的值进行计算。我已经尝试了递归代码的多次迭代,并使用了CTE,但是我一直未能成功实现它。我疯狂地试图让它工作,我宁愿不运行一个循环,因为它需要很长时间才能完成。我们正在运行SQL Server 2012和我写在2014年SSMSSQL-Server递归查询

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行计算第二行

select x1*y1 + x2*y2 + x3 * (previous row's calculated value) 

请让我知道,如果有我丢失的东西,因为我有8760行数据,我需要通过57次(每次为不同的数据集)滚动,做循环并不快enoug h为我所需要的。

+2

使用LAG/LEAD?这可能比递归cte – dfundako

+0

更容易如果我使用滞后,这不会导致我在查询结束时有8759嵌入式计算吗?意思是,第2行取决于第1行的计算结果,第3行取决于第2行的计算结果,这取决于第1行的计算结果。因此第3行将类似于 'code' select x1 * y1 + x2 * y2 + x3 *(x1 * y1 + x2 * y2 + x3 *(x1 * y1 + x2 * y2 + x3 * ild))'code' 其中第一个圆括号内的x值属于行它是从 –

+0

计算的,使用游标和for循环的过程可能是用于这种级联计算的好方法。 – LukStorms

回答

4

这里是一个递归CTE,但我不能给87000行业绩说话

;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是用增量没有差距

+0

感谢您。我会试试这个报告。 –

+0

哈哈,贴了几乎相同的答案,没有得到像我通常做的时候,当有另一个答案张贴。删除了我的。 – randcd

+0

窗口函数,LAG,LEAD等通常比CTE快很多,因为服务器理解并优化它们。 –