Това е непроверен, приблизителен отговор (ако сте предоставили create table
и insert
изявления за вашите данни/структура, щях да го тествам). Предполага се, че няма разклонение във вашата таблица с транзакции (тоест, че link_trx_id
е уникален). По принцип използваме рекурсивно присъединяване, за да получим групирането, родителската информация и реда, след което използваме аналитични функции, за да получим текуща обща сума (current_net
). Вместо да се опитваме да получим предишната обща сума (което бихме могли да направим), изглежда, че има повече смисъл просто да премахнем credit
на текущия ред и debit
от current_net
.
SELECT trx_id,
debit,
credit,
root_amt - cum_debit + cum_credit + debit - credit AS current_gross,
root_amt - cum_debit + cum_credit AS current_net
FROM (SELECT trx_id,
debit,
credit,
SUM(credit) OVER (PARTITION BY event_id ORDER BY lvl) AS cum_credit,
SUM(debit) OVER (PARTITION BY event_id ORDER BY lvl) AS cum_debit,
root_amt
FROM (SELECT trx_id,
debit,
credit,
LEVEL AS lvl,
CONNECT_BY_ROOT (gross_amount) AS root_amt,
CONNECT_BY_ROOT (event_id) AS event_id
FROM transaction t LEFT OUTER JOIN event e ON t.trx_id = e.transaction_id
CONNECT BY link_trx_id = PRIOR trx_id
START WITH link_trx_id IS NULL))