选择最新的可用值SQL

时间:2018-07-19 12:48:45

标签: sql postgresql coalesce cumulative-sum

下面是一个测试表,用于简化我要在查询中实现的目标。我正在尝试使用运行总和创建一个查询,该总和插入到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列的最后一个累加和。

任何方向都是有价值的。 谢谢

1 个答案:

答案 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