Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Функции на прозореца - Работно общо с нулиране

Това може да стане с помощта на базирано на набор решение:

1. Изчислете нормалната текуща сума (наречете го RT)

2. Изчислете текущия минимум на RT (наречете го MN)

Когато MN е отрицателен, -MN е общото количество, което трябваше да попълните досега. Нека replenish_rt е -MN, когато MN е отрицателен. И така, новата текуща сума (наречете го new_rt) е rt + replenish_rt. И ако трябва да върнете текущото необходимо количество за попълване, извадете предишния replenish_rt (използвайки LAG) от текущото.

Ето пълната заявка за решение:

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);
Наздраве, Ицик

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е значението на SELECT ... FOR XML PATH(' ),1,1)?

  2. Връщане на всички деактивирани ограничения в SQL Server (пример за T-SQL)

  3. Как работи функцията NCHAR() в SQL Server (T-SQL)

  4. Функция с стойност на таблица с множество изрази срещу функция с стойност на вградена таблица

  5. SELECT DISTINCT игнорира различни случаи