Postgres 根据 generate_serial 的结果每天查询滚动 SUM

Postgres querying rolling SUM for every day according to a result of generate_serial

我有一个 table,我想进行一个查询,以显示某个时间段内每一天的产品库存,而不仅仅是库存移动完成的日期。

我的解决方案是:

SELECT gs::date, COALESCE(moves,0), btb_goods FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs LEFT JOIN (SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date FROM mytable GROUP BY btb_goods, btb_date) AS mozg ON (date(mozg.btb_date) = gs) ORDER BY 1 ASC;

有效。结果是:

 2017-11-05 |        0 |         |     
 2017-11-06 |        0 |         |     
 2017-11-07 |        0 |         |     
 2017-11-08 |     54.1 |   sugar |  
 2017-11-09 |        0 |         |    
 2017-11-10 |        0 |         |    
 2017-11-11 |        0 |       

A想要的结果是从库存发生之日起滚动,像这样:

 2017-11-05 |        0 |         |     
 2017-11-06 |        0 |         |     
 2017-11-07 |        0 |         |     
 2017-11-08 |     54.1 |   sugar |  
 2017-11-09 |     54.1 |   sugar |    
 2017-11-10 |     54.1 |   sugar |    
 2017-11-11 |     54.1 |     

一想,我应该写点什么WHERE mozg.btb_date ‹ ...

但是我不知道如何实现这个。

提前致谢。

这是假设很多,如果它不适用于您的真实数据集,我不会感到震惊,但它应该适用于您的样本:

with cte as (
  SELECT
    gs::date, COALESCE(moves,0) as moves, btb_goods 
  FROM generate_series('2017-10-01','2017-11-30',INTERVAL '1 DAY') AS gs 
  LEFT JOIN (
    SELECT COALESCE(SUM(btb_menny),0) as moves, btb_goods, btb_date
    FROM mytable
    GROUP BY btb_goods, btb_date) AS mozg 
  ON (date(mozg.btb_date) = gs)
)
select
  gs, sum (moves) over (order by gs) as moves,
  max (btb_goods) over (order by gs) as btb_goods
from cte
order by gs

缺少的(我认为)是当你遇到另一条非空值的记录时你会怎么做,特别是在文本上(但也在数字上) .您希望如何处理?

换句话说,当您最初查询 returns this:

时,期望的结果是什么
11/1/2017     0
11/2/2017    12     jelly
11/3/2017     0
11/4/2017    15     jam
11/5/2017     0