Вы ищете аналитическую функцию SUM
.
Первый агрегат CREDIT
и DEBIT
на уровне дня (с использованием GROUP BY), см. Подзапрос ниже.
Чем использовать аналитическую функцию SUM
sum(CREDIT - DEBIT) over (order by TRANS_DATE) as balance
Вы опустили опцию windowing_clause, что означает, что вы суммируете всю строку до текущей строки в данном порядке.См. Соответствующую часть из документации ниже.
Если вы полностью опустите windowing_clause, по умолчанию будет использоваться ДИАПАЗОН МЕЖДУ НЕПРЕРЫВНЫМ ПРЕЦЕДИРОВАНИЕМ И ТЕКУЩЕЙ СТРОКОЙ.
Обратите внимание, что вы рассчитываете баланс в глобальном масштабе, поэтому вы не делаетеиспользуйте предложение PARTITION BY
.Вы сделаете это, если рассмотрите баланс, например, на основе учетной записи.
Запрос
with day_bal as (
select trans_date, sum(nvl(credit,0)) credit, sum(nvl(debit,0)) debit from bal
group by trans_date)
select
TRANS_DATE, CREDIT, DEBIT,
sum(CREDIT - DEBIT) over (order by TRANS_DATE) as balance
from day_bal
order by 1;
дает
TRANS_DATE CREDIT DEBIT BALANCE
------------------- ---------- ---------- ----------
24-09-2018 00:00:00 3000 600 2400
30-09-2018 00:00:00 800 1200 2000