To lze provést pomocí řešení založeného na množině:
1. Vypočítejte normální průběžný součet (říkejte tomu RT)
2. Vypočítejte průběžné minimum RT (říkejte mu MN)
Když je MN záporné, -MN je celkové množství, které jste dosud museli doplnit. Nechť replenish_rt je -MN, když je MN záporné. Takže nový průběžný součet (nazývejte to new_rt) je rt + replenish_rt. A pokud potřebujete vrátit aktuální potřebné množství doplnění, odečtěte prošlé replenish_rt (pomocí LAG) od aktuálního.
Zde je úplný dotaz na řešení:
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);Na zdraví, Itziku