Dit is een niet-getest antwoord bij benadering (als u create table
had opgegeven) en insert
verklaringen voor uw gegevens/structuur, ik zou het hebben getest). Het gaat ervan uit dat er geen vertakkingen zijn in uw transactietabel (dat wil zeggen dat link_trx_id
is uniek). Kortom, we gebruiken een recursieve join om de groepering, bovenliggende informatie en volgorde te krijgen, en gebruiken vervolgens analytische functies om een lopend totaal te krijgen (current_net
). In plaats van te proberen het vorige totaal te krijgen (wat we zouden kunnen doen), lijkt het logischer om simpelweg het credit
van de huidige rij te verwijderen en debit
van het 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))