declare @Temp table
(
Grp int,
Bal float,
[Value] float
)
declare @Amt float =1000;
Insert into @Temp(Grp,[Value])
Values(1,10),(1,5),(1,15)
,(2,20),(2,5),(2,15)
,(3,50),(3,50)
select Grp,@Amt as Amount,Value,Bal from @Temp
所需输出:
Grp Amount Value Bal
1 1000 10 1000
1 1000 5 1000
1 1000 15 1000
2 1000 20 1030 ---(10+5+15)
2 1000 5 1030
2 1000 15 1030
3 1000 50 1070 ---- (20+5+15)
3 1000 50 1070
根据添加到第2组的第1组的"价值"的运行总数和添加到第3组的余额的第2组运行总数以及即将计算的余额
我知道如何计算运行总数,但我不会,因为总和会加到下一个分区。
请帮助有效地获得所需的结果。我正在使用SQL Server 2017
一种方法是outer apply
:
select t.*, t.amount + coalesce(t2.value, 0)
from @temp t outer apply
(select sum(t2.value) as value
from @temp t2
where t2.grp < t.grp
) t2;
使用聚合和运行求和可能更有效:
select t.*,
(1000 + tt.running_value)
from @temp t join
(select t.grp, sum(value) as value,
sum(sum(value)) over (order by grp) - sum(value) as running_value
from @temp t
group by grp
) tt
on t.grp = tt.grp;
不幸的是,SQL Server并不完全支持range
窗口框架,所以我认为没有一种只使用窗口函数来实现这一点的方便方法。但是group by
可能会有更好的性能。