SQL Server 递归查询

标签 sql-server

我有一些数据驻留在一个表中,我可以轻松地从中选择,并且我需要根据前一行的值计算每行的输出值,但第一行除外,它是使用值计算的我最初在选择查询中计算。我尝试了递归代码的多次迭代并利用 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,但我无法谈论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 是增量的,没有间隙

关于SQL Server 递归查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40679865/

相关文章:

SQL 将数据排序为模式

sql-server - 从 SQL Server 的子查询中选择多列

c# - LINQ 语句中的条件 IF 语句

mysql - 使用 SQL INNER JOIN 批量更新字段

sql-server - 如何获取 SQL 数据库中已有的 "shred"JSON 数据?

c# - 将sql返回保存在一个字符串中

SQL Server 其中 start_date 和 End_date 之间的日期

python - 使用 Python 从 sql server 数据库中检索数据

sql-server - 存储过程导致的转换死锁

sql - 在一组重叠的、版本编号的间隔中,找到每个时间点的最新版本