Вы можете сделать это в два прохода: один, чтобы получить theTrxCost
, затем один, чтобы получить Ave_cost
.
То, что вы называете "средним", это, кстати, промежуточная сумма;вы просто складываете значения.
Вам нужны оконные функции с предложениями ROWS BETWEEN
.(В случае SUM(...) OVER (ORDER BY ...)
это неявно BETWEEN UNBOUNDED PRECEDING AND CURRENT
, однако).
select
id, type, unit, cost, round(trxcost, 2) as trxcost,
round(sum(trxcost) over (order by id), 2) as ave_cost
from
(
select
id, type, unit, cost,
case
when type = 'Sub' then cost
else
unit *
sum(cost) over (order by id rows between unbounded preceding and 1 preceding) /
sum(unit) over (order by id rows between unbounded preceding and 1 preceding)
end as trxcost
from mytable
)
order by id;
Я переименовал ваш row
столбец id
, потому что ROW
является зарезервированным словом.
Результаты последнего ряда отличаются от ваших.Я использовал вашу формулу, но получил разные цифры.
Rextester demo: https://rextester.com/ASXFY4323