Đây là câu trả lời gần đúng, chưa được kiểm tra (nếu bạn đã cung cấp create table
và insert
cho dữ liệu / cấu trúc của bạn, tôi đã thử nghiệm nó). Nó giả định rằng không có phân nhánh trong bảng giao dịch của bạn (nghĩa là link_trx_id
là duy nhất). Về cơ bản, chúng tôi sử dụng phép nối đệ quy để lấy nhóm, thông tin gốc và thứ tự, sau đó sử dụng các hàm phân tích để nhận tổng số đang chạy (current_net
). Thay vì cố gắng lấy tổng số trước đó (điều mà chúng tôi có thể làm), có vẻ hợp lý hơn nếu chỉ cần xóa credit
của hàng hiện tại và debit
từ 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))