下面是一个测试表,用于简化我要在查询中实现的目标。我正在尝试使用运行总和创建一个查询,该总和插入到column b
中,最后一个总和结果不为null。如果您可以想象,我希望每天获得某个客户的累计购买金额,那么某些天没有为特定客户购买任何商品,因此我想显示该特定客户的最新金额,而不是0 / null。< / p>
CREATE TABLE test (a int, b int);
insert into test values (1,null);
insert into test values (2,1);
insert into test values (3,3);
insert into test values (4,null);
insert into test values (5,5);
insert into test values (6,null);
1- select sum(coalesce(b,0)),coalesce(0,sum(b)) from test
2- select a, sum(coalesce(b,0)) from test group by a order by a asc
3- select a, sum(b) over (order by a asc rows between unbounded preceding and current row) from test group by a,b order by a asc
我不确定我对合并工作原理的解释是否正确。我以为这个sum(coalesce(b,0))
会在b为null的地方插入0,并且总是取b列的最新累积和。
认为我可能已经通过查询3解决了它。
我期望的结果将如下所示:
a | sum
--------
1
2 1
3 4
4 4
5 9
6 9
a的每条记录都显示b列的最后一个累加和。
任何方向都是有价值的。 谢谢
答案 0 :(得分:3)
在Postgres中,您还可以将SUM的窗口函数用于累积和。
示例:
create table test (a int, b int); insert into test (a,b) values (1,null),(2,1),(3,3),(4,null),(5,5),(6,null);
select a, sum(b) over (order by a, b) as "sum" from test;
a | sum -- | ---- 1 | null 2 | 1 3 | 4 4 | 4 5 | 9 6 | 9
db <>提琴here
如果“ a”不是唯一的,但您想对a进行分组?
然后,您可以使用一个suminception:
select a, sum(sum(b)) over (order by a) as "sum"
from test
group by a