2015-12-29 43 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 |