Detta är ett oprövat, ungefärligt svar (om du hade tillhandahållit create table
och insert
uttalanden för din data/struktur, jag skulle ha testat det). Det förutsätter att det inte finns någon förgrening i din transaktionstabell (det vill säga att link_trx_id
är unik). I grund och botten använder vi en rekursiv koppling för att få grupperingen, överordnad information och ordning, och sedan använder vi analytiska funktioner för att få en löpande summa (current_net
). Istället för att försöka få den föregående summan (vilket vi kunde göra), verkar det vara mer meningsfullt att helt enkelt ta bort den nuvarande radens credit
och debit
från 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))