使用 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 移动计算的主要内容,如果未能解决你的问题,请参考以下文章