如何生成日期范围+从PostgreSQL中的另一个表中计算更早的日期?

Mat*_*lič 5 sql postgresql date count range

我有下表:

links:

created_at           active 
2017-08-12 15:46:01  false
2017-08-13 15:46:01  true
2017-08-14 15:46:01  true
2017-08-15 15:46:01  false
Run Code Online (Sandbox Code Playgroud)

给定日期范围时,我必须提取时间序列,该时间序列告诉我在等于或小于当前(滚动)日期的日期创建了多少活动链接.

输出(日期范围2017-08-12 - 2017-08-17):

day          count
2017-08-12   0 (there are 0 active links created on 2017-08-12 and earlier)
2017-08-13   1 (there is 1 active link created on 2017-08-13 and earlier)
2017-08-14   2 (there are 2 active links created on 2017-08-14 and earlier)
2017-08-15   2 ...
2017-08-16   2
2017-08-17   2
Run Code Online (Sandbox Code Playgroud)

我想出了以下关于生成日期的查询:

SELECT date_trunc('day', dd):: date
FROM generate_series
    ( '2017-08-12'::timestamp 
    , '2017-08-17'::timestamp
    , '1 day'::interval) dd
Run Code Online (Sandbox Code Playgroud)

但滚动计数令我困惑,我不确定如何继续.这可以通过窗口函数解决吗?

Erw*_*ter 2

这应该是最快的:

SELECT day::date
     , sum(ct) OVER (ORDER BY day) AS count
FROM   generate_series (timestamp '2017-08-12'
                      , timestamp '2017-08-17'
                      , interval  '1 day') day
LEFT   JOIN  (
   SELECT date_trunc('day', created_at) AS day, count(*) AS ct
   FROM   tbl
   WHERE  active -- fastest
   GROUP  BY 1
   ) t USING (day)
ORDER  BY 1;
Run Code Online (Sandbox Code Playgroud)

dbfiddle在这里

count()仅计算非空行,因此您可以使用count(active OR NULL). 但最快的计数选项是通过子句排除不相关的行WHERE。由于我们添加所有天数generate_series(),所以这是最好的选择。

比较:

由于generate_series()返回timestamp(不是date),我用来date_trunc()获取匹配的时间戳(速度稍快一些)。