Detta kan göras med en uppsättningsbaserad lösning:
1. Beräkna den normala löpande summan (kalla det RT)
2. Beräkna minimivärdet för RT (kalla det MN)
När MN är negativ är -MN den totala mängden du behövt fylla på hittills. Låt replenish_rt vara -MN när MN är negativ. Så, den nya löpande summan (kalla det new_rt) är rt + replenish_rt. Och om du behöver returnera den aktuella påfyllningsmängden som behövs, subtrahera den pervious replenish_rt (med hjälp av LAG) från den nuvarande.
Här är den fullständiga lösningsfrågan:
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);Skål, Itzik