Dette er et uafprøvet, omtrentligt svar (hvis du havde angivet create table
og insert
udsagn til dine data/struktur, ville jeg have testet det). Det antager, at der ikke er nogen forgrening i din transaktionstabel (det vil sige, at link_trx_id
er unik). Grundlæggende bruger vi en rekursiv joinforbindelse til at få gruppering, overordnet information og rækkefølge, og derefter bruge analytiske funktioner til at få en løbende total (current_net
). I stedet for at prøve at få den forrige total (hvilket vi kunne gøre), ser det ud til at give mere mening blot at fjerne den nuværende rækkes credit
og debit
fra 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))