sql >> Databáze >  >> RDS >> Sqlserver

Funkce okna - Průběh celkem s resetem

To lze provést pomocí řešení založeného na množině:

1. Vypočítejte normální průběžný součet (říkejte tomu RT)

2. Vypočítejte průběžné minimum RT (říkejte mu MN)

Když je MN záporné, -MN je celkové množství, které jste dosud museli doplnit. Nechť replenish_rt je -MN, když je MN záporné. Takže nový průběžný součet (nazývejte to new_rt) je rt + replenish_rt. A pokud potřebujete vrátit aktuální potřebné množství doplnění, odečtěte prošlé replenish_rt (pomocí LAG) od aktuálního.

Zde je úplný dotaz na řešení:

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);
Na zdraví, Itziku

  1. MySQL vybrat před po řádku

  2. Jak vyřešit varování mysql:InnoDB:page_cleaner:zamýšlená smyčka 1000 ms trvala XXX ms. Nastavení nemusí být optimální?

  3. Předejte pole uložené rutině MySQL

  4. Jaká je chyba Každá odvozená tabulka musí mít v MySQL svůj vlastní alias?