sql >> Database teknologi >  >> RDS >> Sqlserver

Vinduesfunktioner - Løbende total med nulstilling

Dette kan gøres ved hjælp af en sæt-baseret løsning:

1. Beregn den normale løbende total (kald det RT)

2. Beregn det kørende minimum af RT (kald det MN)

Når MN er negativ, er -MN den samlede mængde, du har skullet genopfylde indtil videre. Lad replenish_rt være -MN, når MN er negativ. Så den nye løbende total (kald det new_rt) er rt + replenish_rt. Og hvis du skal returnere den aktuelle genopfyldningsmængde, skal du trække den pervious replenish_rt (ved hjælp af LAG) fra den nuværende.

Her er den komplette løsningsforespørgsel:

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);
Skål, Itzik

  1. Sikkerhedskopier en tabel med en GEOMETRY-kolonne ved hjælp af mysqldump?

  2. Hvordan finder man unikke par fra to kolonner i SQL?

  3. Deaktivering af fremmednøglekontrol på kommandolinjen

  4. Forbind SQL Server til SugarCRM