Cela peut être fait à l'aide d'une solution basée sur des ensembles :
1.Calculez le total cumulé normal (appelez-le RT)
2.Calculez le minimum courant de RT (appelez-le MN)
Lorsque MN est négatif, -MN est la quantité totale que vous avez dû réapprovisionner jusqu'à présent. Soit replenish_rt égal à -MN lorsque MN est négatif. Ainsi, le nouveau total cumulé (appelez-le new_rt) est rt + replenish_rt. Et si vous devez retourner la quantité de réapprovisionnement actuelle nécessaire, soustrayez le replenish_rt précédent (en utilisant LAG) du courant.
Voici la requête de solution complète :
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);
À votre santé, Itzik