Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fensterfunktionen - Laufende Summe mit Zurücksetzen

Dies kann mit einer satzbasierten Lösung erfolgen:

1.Berechnen Sie die normale laufende Summe (nennen Sie es RT)

2.Berechnen Sie das laufende Minimum von RT (nennen Sie es MN)

Wenn MN negativ ist, ist -MN die Gesamtmenge, die Sie bisher auffüllen mussten. Replenish_rt sei -MN, wenn MN negativ ist. Die neue laufende Summe (nennen Sie sie new_rt) ist also rt + replenish_rt. Und wenn Sie die aktuell benötigte Nachfüllmenge zurückgeben müssen, subtrahieren Sie die vorherige replenish_rt (unter Verwendung von LAG) von der aktuellen.

Hier ist die vollständige Lösungsabfrage:

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);
Gruß, Itzik