我有一张包含银行对账单的表格。在每一行中,我都有银行交易的日期,金额和运行余额(处理交易后的余额)。 我也有当前的余额,它等于最后一个trx的运行平衡。
问题在于交易未按发布顺序排序。我想使用每行的信息和以下自然逻辑对它们进行排序:
排序后,对于每一行,运行余额将是下一行的“起始余额”,其中行的起始余额=运行余额 - 交易金额。当然,行也需要按日期排序。
例如,假设所有交易都在同一天发布。
运行平衡= 0
Trx 1:金额50,运行余额-51
Trx 2:金额51,运行余额0
Trx 3:金额60,运行余额-101。
顺序(从最新到第一):
Trx 2
Trx 1
Trx 3
可能会有几个有效的订单。在这种情况下,我可以满足任何有效的订购。
这在SQL(任何变体)中是否可行?我虽然使用自连接和分区来做这个,但我有限的是使连接数等于一天内发布的trx的最大数量,而我想要一个单独发布的任意数量的trx的解决方案一天。
答案 0 :(得分:1)
如果您有一个定义事务顺序的实时时间戳列,那么在标准ANSI SQL中这很容易:
select account_id,
transaction_id,
transaction_time,
sum(amount) over (partition by account_id order by transaction_time) as running_total
from transactions
order by account_id, transaction_time;
如果您不存储交易的“执行订单”,则无法获得正确的运行余额。
以上内容适用于(至少)Postgres,Oracle,DB2,SQL Server 2012,Teradata
答案 1 :(得分:0)
您应该能够执行与您的函数匹配的ORDER BY子句以获得运行总计。
示例:
SELECT a.AccountID, sum(t.Amount)
FROM Account a
INNER JOIN Transaction t on a.AccountID = t.AccountID
GROUP BY a.AccountID
ORDER BY sum(t.Amount) DESC
然后,您可以添加更多ORDER BY子句,以便从那里进一步订购