Вы можете использовать аналитические функции для генерации промежуточной суммы в большинстве баз данных.В Oracle что-то вроде
SELECT billable_account_id,
SUM( (CASE WHEN credit IS NOT NULL THEN credit
WHEN debit IS NOT NULL THEN -1 * debit
ELSE 0
END) ) OVER (PARTITION BY billable_account_id
ORDER BY transaction_date ) running_total
FROM transactions
Если у вас нет TRANSACTION_DATE, вы можете использовать ID, предполагая, что вы можете гарантировать, что сгенерированные идентификаторы увеличиваются монотонно.
Однако изС точки зрения производительности, вы, вероятно, захотите согнуть, если не нарушите третьи нормальные правила нормализации формы для отчетов типа OLAP / DSS, потому что люди захотят отчитываться по итоговым суммам довольно часто, и некоторые учетные записи, вероятно, будут иметь большое количество транзакций.Например, вы можете захотеть создать отдельную таблицу с конечным балансом для каждого BILLABLE_ACCOUNT_ID для каждого конца месяца, а затем использовать аналитическую функцию, чтобы просто добавить транзакции текущего месяца в конечный баланс прошлого месяца.В Oracle вы можете создать материализованное представление, которое будет автоматически поддерживать промежуточную сумму.