Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctions de la fenêtre - Total cumulé avec réinitialisation

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