使用 SQL 移动计算

Posted

技术标签:

【中文标题】使用 SQL 移动计算【英文标题】:Moving calculations using SQL 【发布时间】:2021-02-26 08:25:10 【问题描述】:

我需要使用移动计算来计算一个新列。

例如,我有一张桌子:

A B
10 15
11 14
12 13

我需要计算新列,其中 第一个值 计算为 5000/10*15第二个值(5000 / 10 * 15) / 11 * 14第三个((5000 / 10 * 15) / 11 * 14) / 12 * 13以此类推。其中 5000 是一个随机值,以后我会像存储过程中的参数一样使用它。

我知道,例如在 Excel 中,我们可以参考之前计算的单元格。用SQL怎么计算?

谢谢!

【问题讨论】:

请试一试,告诉我们您尝试了什么以及您遇到的问题! SQL 表表示无序(多)集。您的表没有明显的顺序。如果第一列用于此目的,则应明确。 【参考方案1】:
create table #test (A int,B int)

insert into #test values(10,15),(11,14),(12,13)

declare @seed int=5000;

;with temp as (
 select A,B,row_number() over(order by a) rn from #test
),
cte as
(
 select @seed/A*B  calculated,rn from temp where rn=1
 union all
 select c. calculated/t.A*t.B,t.rn from temp t
 join cte c on t.rn=c.rn+1
)
select * from cte

【讨论】:

【参考方案2】:

文档中有一条警告:

如果单个 SELECT 语句中有多个赋值子句, SQL Server 不保证计算的顺序 表达式。请注意,效果只有在有 作业之间的引用。 这意味着不能保证它会从左到右评估表达式。对于此代码:

declare @a int, @b int;
select @a = 2, @b = @a * 3;
select @a, @b;

结果可能是 2, 6(@a = ... 首先评估)或 2, NULL(@b = ... 首先评估)。

【讨论】:

嗨!感谢您的回答。但我不确定这是否是我真正需要的。

以上是关于使用 SQL 移动计算的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2012 中计算移动平均线

使用 sql 查询计算特定的移动平均线

sql 如何使用SQL计算日历季度的剩余天数

根据行号执行 SQL 更新并使用前一行进行计算

SQL 2014,s-s-rS - 使用参数的时间计算给出错误和错误的计算

在 Case 语句中使用计算 - Oracle SQL