sql:使用运行的sum列对行进行排序

时间:2014-01-09 18:08:17

标签: sql sorting

我有一张包含银行对账单的表格。在每一行中,我都有银行交易的日期,金额和运行余额(处理交易后的余额)。 我也有当前的余额,它等于最后一个trx的运行平衡。

问题在于交易未按发布顺序排序。我想使用每行的信息和以下自然逻辑对它们进行排序:

排序后,对于每一行,运行余额将是下一行的“起始余额”,其中行的起始余额=运行余额 - 交易金额。当然,行也需要按日期排序。

例如,假设所有交易都在同一天发布。
运行平衡= 0

Trx 1:金额50,运行余额-51
Trx 2:金额51,运行余额0
Trx 3:金额60,运行余额-101。

顺序(从最新到第一):
Trx 2
Trx 1
Trx 3

可能会有几个有效的订单。在这种情况下,我可以满足任何有效的订购。

这在SQL(任何变体)中是否可行?我虽然使用自连接和分区来做这个,但我有限的是使连接数等于一天内发布的trx的最大数量,而我想要一个单独发布的任意数量的trx的解决方案一天。

2 个答案:

答案 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子句,以便从那里进一步订购