2015-12-29 82 views
2

我有一個帳戶交易表,其中列出了帳戶中的所有活動。如何根據其他行計算總和

id qty 
1  100  
2  200  
3  -50  
4  20  

的id列是實時活動1後indecation作爲2 hapend和34發生。

我需要添加一列,其每每一行給出當前總和:

id qty total_sum 
1 100 100 /0 + 100 
2 200 300 /100 + 200 
3 -50 250 /300 - 50 
4 20  270 /250 + 20 

這是很簡單的。不過,我的表很龐大,它包含非常舊的行,它們的數據不是正確的。爲了避免它,我想計算總和從按鈕到頂部,以便至少最新的記錄將具有正確的值。在我的情況下,對每個用戶來說都是可行的,我總是爲當前保存當前更新的total_sum ...所以我有一個開始的值。

在這種情況下(+將考慮爲--+)我得到的是:

id qty total_sum 
1 100 0 /100 - 100 
2 200 100/300 - 200 
3 -50 300 /250 + 50 
4 20  250 /init_value - 20 

的問題是,每行中total_sum行動之前提出的總和該行已完成。例如在第2行中,它顯示了total_sum=100,這是在處理第2行的動作之前。

我怎樣才能解決這個問題,以顯示第一列total_sum但BUTTOM計算?

basicly我需要的是:

id qty total_sum 
1 100 100 
2 200 300 
3 -50 250 
4 20  init_value (which is 270) 

這是我的代碼:

SELECT id,qty,(select init_value from x where .....) 
    - Sum(a.qty)OVER(ORDER BY id DESC) as total_sum 
FROM a 
ORDER BY id ASC 

我怎樣才能解決呢? (PostgreSQL的9.3)

回答

2

您需要使用LEAD/LAG函數訪問一個/上一個數量和使用,在SUM。

SQL Fiddle

的PostgreSQL 9.3架構設置

create table myt(
    id_ integer, 
    qty_ integer 
); 

insert into myt values(1,100); 
insert into myt values(2,200); 
insert into myt values(3,-50); 
insert into myt values(4,20); 

查詢1

select id_, qty_, 
lead(qty_) over (order by id_) qty2 
from myt 
order by id_ 

Results

| id_ | qty_ | qty2 | 
|-----|------|--------| 
| 1 | 100 | 200 | 
| 2 | 200 | -50 | 
| 3 | -50 |  20 | 
| 4 | 20 | (null) | 

查詢2

select id_, qty_, 
270 - coalesce((sum(qty2) over (order by id_ desc)),0) total_sum 
from (
    select id_, qty_, 
    lead(qty_) over (order by id_) qty2 
    from myt 
) c 
order by id_ 

Results

| id_ | qty_ | total_sum | 
|-----|------|-----------| 
| 1 | 100 |  100 | 
| 2 | 200 |  300 | 
| 3 | -50 |  250 | 
| 4 | 20 |  270 |