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