sql >> Database >  >> RDS >> Sqlserver

Vensterfuncties - Lopend totaal met reset

Dit kan worden gedaan met behulp van een set-gebaseerde oplossing:

1. Bereken het normaal lopende totaal (noem het RT)

2. Bereken het lopende minimum van RT (noem het MN)

Als MN negatief is, is -MN de totale hoeveelheid die u tot nu toe heeft moeten aanvullen. Laat aanvulling_rt -MN zijn als MN negatief is. Dus het nieuwe lopende totaal (noem het new_rt) is rt + aanvulling_rt. En als u de huidige benodigde aanvullingshoeveelheid moet teruggeven, trekt u de vorige aanvulling_rt (met behulp van LAG) van de huidige af.

Hier is de volledige vraag naar de oplossing:

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

  1. Hoeveel impact kan een datatypekeuze hebben?

  2. 3 manieren om ALL in SQL Server te gebruiken

  3. Laad CSV-gegevens in MySQL in Python

  4. Hoofden in de cloud bij CHAR(10)