Това може да стане с помощта на базирано на набор решение:
1. Изчислете нормалната текуща сума (наречете го RT)
2. Изчислете текущия минимум на RT (наречете го MN)
Когато MN е отрицателен, -MN е общото количество, което трябваше да попълните досега. Нека replenish_rt е -MN, когато MN е отрицателен. И така, новата текуща сума (наречете го new_rt) е rt + replenish_rt. И ако трябва да върнете текущото необходимо количество за попълване, извадете предишния replenish_rt (използвайки LAG) от текущото.
Ето пълната заявка за решение:
with c1 as ( select *, sum(qty) over(order by tdate rows unbounded preceding) as rt from tx ), c2 as ( select *, -- when negative, mn is the total qty that had to be -- replenished until now, inclusive min(rt) over(order by tdate rows unbounded preceding) as mn_cur from c1 ) select tdate, qty, rt, replenish_rt - lag(replenish_rt, 1, 0) over(order by tdate) as replenish, rt + replenish_rt as new_rt from c2 cross apply(values(case when mn_cur < 0 then -mn_cur else 0 end)) as a1(replenish_rt);Наздраве, Ицик