あなたのデータは実際には関係ありませんので、それほど大きくありません。しかし、それを行うことができます - 例コード:
create table #data (id int, currentQuantity int, quantityChanged int);
insert into #data values (-30, NULL, -10);
insert into #data values (-24, NULL, -10);
insert into #data values (-22, NULL, -10);
insert into #data values (-11, NULL, -5);
insert into #data values (20, -45, -5);
select * from #data;
;with rcte as (
select id, currentquantity, quantityChanged, 0 as Level
from #data where id = 20
union all
select d.id, r.currentquantity + (d.quantityChanged * -1),
d.quantityChanged, level + 1
from #data d inner join rcte r on d.id < r.id
)
update #data
set currentQuantity = r.currentQuantity
from #data d
inner join rcte r
on d.id = r.id
inner join (
select id, row_number() over (order by id desc) - 1 level
from #data
) idl
on r.id = idl.id
and r.level = idl.level;
select * from #data;
それはあなたが探しているものを生成する必要があります。
注:SQL Server> 2008を使用している場合は、これを行うために先導機能を使用することもできます。
本当に再帰が必要ですか?ベースラインのCurrentQuantity値(最初または最後)がある場合、実際には以前のすべてのQuantityChanged値を合計し、その結果を各行のベースラインに追加することができます。 –
問題を解決するために必要ではない情報を提供することは、常に避けてください。この場合、必須フィールドはIDフィールドと数量フィールドだけです。このようにして、あなたの投稿はより洗練されたものになり、人々の答えがより魅力的になります。 – FLICKER