如何根据其他行计算总和

时间:2015-12-29 05:39:24

标签: sql postgresql

我有一个帐户交易表,列出了帐户中的所有活动。

id  qty  
1     100    
2     200     
3     -50     
4     20     

id列是实时活动的一个不确定点,因为2143后发生id qty total_sum 1 100 100 / 0 + 100 2 200 300 / 100 + 200 3 -50 250 / 300 - 50 4 20 270 / 250 + 20

我需要添加一列,每列给出当前的总和:

+

这很简单。然而,我的表很大,它包含非常旧的行,其数据不是正确的。为了避免它,我想计算从 buttom到top 的总和,以便至少最新的记录将具有当前值。在我的情况下,它是可行的,因为每个用户我总是保存当前更新的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

问题在于,每一行total_sum=100都会在行上的操作完成之前显示总和。例如,在第2行中,它显示id qty total_sum 1 100 100 2 200 300 3 -50 250 4 20 init_value (which is 270) ,这是在第2行的操作被执行之前。

如何修复它以显示第一个total_sum列,但是从buttom计算?

基本上我需要的是:

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

这是我的代码:

$query = "SELECT * FROM `errors` WHERE `sta`='0'";    
$result = mysql_query($query) or die (mysql_error());    
$row2 = mysql_fetch_array($result);    
$count= mysql_num_rows($result);    
echo $count;

我该如何解决? (Postgresql 9.3)

1 个答案:

答案 0 :(得分: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 |