2014-01-09 140 views
0

我有一個包含銀行對帳單的表。在每一行中,我都有銀行交易的日期,金額和運行餘額(處理交易後的餘額)。 我也有當前餘額,它等於最後一個trx的運行餘額。sql:使用正在運行的sum列對行進行排序

問題是,交易沒有按發佈順序排序。我想使用每行的信息和以下自然邏輯對它們進行排序:

排序後,對於每一行,運行餘額將是下一行的「起始餘額」,其中起始餘額爲行=運行餘額 - 交易金額。當然,行也需要按日期排序。

例如,假設所有交易都在同一天發佈。
運行平衡= 0

的Trx 1:量50,運行平衡-51
的Trx 2:量51,運行平衡0
的Trx 3:量60,運轉平衡-101。

所以順序(從最新到第一):
事務處理2
事務處理1
事務處理3

很可能會有多個有效訂單。在這種情況下,我可以滿足任何有效的排序。

這可能在SQL(任何變體)?我雖然使用自聯接和分區來做這件事,但我有限地使聯接的數量等於一天內發佈的最大trx數量,而我想要一個解決方案來發布任意數量的trxs天。

+0

我沒有看到你的問題的任何類型的代碼。你有嘗試過什麼嗎?如果是這樣,請發佈**代碼**。 – Kermit

回答

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子句從那裏

+0

我無法通過函數定義明確的順序。我只能定義一個有效的訂單。 – Lior

+0

那麼,如果由於某種原因您無法使用ORDER BY,則無法訂購查詢。你將需要更具體。如果您正在討論重新排序表中的實際行,那就無法完成。這就是ORDER BY子句的用途。 – DLeh

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的,甲骨文,DB2,SQL Server 2012中,Teradata的