我有一個看起來像這樣的表:
| 帳戶# | 交易日期 | 開始日余額 | 交易量 | 劃分 |
|---|---|---|---|---|
| 1 | 2012-03-20 | 500 美元 | 25 美元 | 1 |
| 1 | 2012-03-20 | 500 美元 | 30 美元 | 2 |
| 1 | 2012-03-21 | 445 美元 | 25 美元 | 1 |
| 1 | 2012-03-21 | 445 美元 | 10 美元 | 2 |
| 1 | 2012-03-21 | 445 美元 | 25 美元 | 3 |
| 2 | 2012-03-20 | 100 美元 | 5 美元 | 1 |
| 2 | 2012-03-20 | 100 美元 | 25 美元 | 2 |
我需要能夠在每筆交易后按帳戶和按天隔離運行余額。到目前為止,我在運行總計方面所做的研究假設您要加在一起的內容在同一列中,但在這種情況下并非如此。“磁區”列不在原始表上,我添加了它,因為我希望這會有所幫助。
我想要實作的輸出是:
| 帳戶# | 交易日期 | 開始日余額 | 交易量 | 劃分 | Avail_bal |
|---|---|---|---|---|---|
| 1 | 2012-03-20 | 500 美元 | 25 美元 | 1 | 475 美元 |
| 1 | 2012-03-20 | 500 美元 | 30 美元 | 2 | 445 美元 |
| 1 | 2012-03-21 | 445 美元 | 25 美元 | 1 | 420 美元 |
| 1 | 2012-03-21 | 445 美元 | 10 美元 | 2 | 410 美元 |
| 1 | 2012-03-21 | 445 美元 | 25 美元 | 3 | 385 美元 |
| 2 | 2012-03-20 | 100 美元 | 5 美元 | 1 | 95 美元 |
| 2 | 2012-03-20 | 100 美元 | 25 美元 | 2 | 70 美元 |
我嘗試了這樣的事情,但失敗了:
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 Server 上。
uj5u.com熱心網友回復:
你幾乎得到它,只需要更改為
startdaybalance
- sum(transactionamt) over (partition by account#, transaction_date
order by partition_no) as avail_bal
不要包含startdaybalance在 中sum(),這將意味著您正在獲取差異(startdaybalance - transactionamt)并求和
也account#, transaction_date已經在 中partition by,再次出現在 中沒有意義order by
請避免使用關鍵字作為列名或別名 ( partition)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/447907.html
