Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server递归查询_Sql Server - Fatal编程技术网

Sql server SQL Server递归查询

Sql server SQL Server递归查询,sql-server,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 in

我有一些数据驻留在一个可以轻松选择的表中,我需要根据前一行的值计算每一行的输出值,第一行除外,第一行是使用我最初在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行的代码为

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

请让我知道我是否遗漏了什么,因为我有8760行数据,需要滚动57次(每一行都是不同的数据集),并且循环速度不够快,无法满足我的需要。

这里是一个递归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是增量的,没有间隙

使用滞后/超前?这可能比递归CTEI更容易如果我使用lag,那么在查询结束时是否会有8759个嵌入计算?也就是说,第2行依赖于第1行的计算结果,第3行依赖于第2行的计算结果,第2行依赖于第1行的计算结果。所以第3行类似于
code
select x1*y1+x2*y2+x3*(x1*y1+x2*y2+x3*(x1*y1+x2*y2+x3*ild))
code
其中,第一个括号内的x值属于该行,它是通过带有光标和for循环的过程计算出来的。对于这种级联计算,这可能是一种很好的方法。这就是我目前对它进行编码的方式,但完成计算需要8分钟。我希望在不使用单独的编译语言的情况下找到一个更快的解决方案。这不是迂腐,但x1*y1+x2*y2+x3*ild和(x1*y1+x2*y2+x3)*ild之间有很大的区别,这是预期的操作顺序?第一行是预期答案258.5或7503.5?哈哈,贴出了几乎相同的答案,没有像我通常在贴出另一个答案时那样得到祝酒词。删除了我的。窗口功能、滞后、超前等通常比CTE快得多,因为服务器理解它们并可以优化它们。@RuslanK。我怀疑你复制了RN?@PanagiotisKanavos 100%的协议,这是我的第一个想法,然而,我被困在了cascade@John卡佩莱蒂,谢谢你的密码。虽然它确实回答了这个问题(我将对此给予赞扬),但数据集的总体性能仍然基本相同。我将尝试更多地研究滞后选项,看看我是否可以加快速度。