我有一个帐户交易表,列出了帐户中的所有活动。
id qty
1 100
2 200
3 -50
4 20
id列是实时活动的一个不确定点,因为2
后1
为4
,3
后发生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)
答案 0 :(得分:2)
您需要使用LEAD / LAG功能访问下一个/上一个数量并在SUM中使用它。
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 |