sql >> Databasteknik >  >> RDS >> Sqlserver

Fönsterfunktioner - Totalt med återställning

Detta kan göras med en uppsättningsbaserad lösning:

1. Beräkna den normala löpande summan (kalla det RT)

2. Beräkna minimivärdet för RT (kalla det MN)

När MN är negativ är -MN den totala mängden du behövt fylla på hittills. Låt replenish_rt vara -MN när MN är negativ. Så, den nya löpande summan (kalla det new_rt) är rt + replenish_rt. Och om du behöver returnera den aktuella påfyllningsmängden som behövs, subtrahera den pervious replenish_rt (med hjälp av LAG) från den nuvarande.

Här är den fullständiga lösningsfrågan:

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. SQL Backup Recovery Tool för att reparera skadad SQL Backup - Produktrecension - Ett gästinlägg av Daniel Jones

  2. Hur man kontrollerar vilka lås som hålls på ett bord

  3. Hur återställer man primärnyckeln för en tabell?

  4. Hur GET_FORMAT() fungerar i MariaDB