在 SQL 个减法交易中创建 运行 个账户余额

Create Running Account Balance in SQL Subtracting Transactions

我有一个 table 看起来像这样:

account# Transaction_Date StartDayBalance TransactionAmt Partition
1 2012-03-20 0 1
1 2012-03-20 0 2
1 2012-03-21 5 1
1 2012-03-21 5 2
1 2012-03-21 5 3
2 2012-03-20 0 1
2 2012-03-20 0 2

我需要能够在每次交易后按帐户和按天隔离 运行 余额。到目前为止,我对 运行 总计所做的研究假设您要加在一起的内容在同一列中,但在本例中并非如此。 “分区”列不在原来的 table 中,我添加了它,因为我希望这会有所帮助。

我要实现的输出是:

account# Transaction_Date StartDayBalance TransactionAmt Partition Avail_bal
1 2012-03-20 0 1 5
1 2012-03-20 0 2 5
1 2012-03-21 5 1 0
1 2012-03-21 5 2 0
1 2012-03-21 5 3 5
2 2012-03-20 0 1
2 2012-03-20 0 2

我试过类似的方法,但失败得很厉害:

sum(startdaybalance - transactionamt) over(partition by account#,transaction_date,order by account#,transaction_date) as avail_bal

结果是对剩余余额求和,这是不对的。

然后我尝试了一个案例,当系列很快变得丑陋并且也不起作用时:

set avail_bal = case when partition=1 then (startdaybalance - transactionamt)
                    when partition=2 then (case when partition=1 then (startdaybalance - transactionamt) end) - transactionamt
                    when partition =3 then (case when partition=2 then (startdaybalance - transactionamt) end) - transactionamt end

这也不是特别可持续,因为我要处理数百万行交易,有时一个人有 50 多笔交易。

此处提供任何有关如何使“avail_bal”列适当执行的​​指导,我们将不胜感激。这是在 SQL 服务器上。

你已经差不多搞定了,只需要换成

startdaybalance 
- sum(transactionamt) over (partition by account#, transaction_date
                                order by partition_no) as avail_bal

不要在 sum() 中包含 startdaybalance,这意味着您要对 (startdaybalance - transactionamt) 求和并求和

此外 account#, transaction_date 已经在 partition by 中,没有意义再次出现在 order by

请避免使用关键字作为列名或别名 (partition)。