Postgres,每天计数条目,包括没有的天数

Posted

技术标签:

【中文标题】Postgres,每天计数条目,包括没有的天数【英文标题】:Postgres, Count entries per day including days with none 【发布时间】:2018-08-28 23:05:27 【问题描述】:

我有一个包含几个字段的表,但我只想计算每天 state 字段所在的条目,例如'被拒绝'。 createdAt 字段是带有时区的时间戳

id | createdAt                  | state
------------------------------------------
1  | 2018-01-17 13:53:17.303+00 | rejected
2  | 2017-10-19 20:39:18.232+00 | approved

所以我想计算两个时间戳之间每天的行数。没有任何条目的天数应返回 0 或 NULL。 我创建的查询返回正确的时间序列,但不知何故,我的加入或计数似乎很奇怪。它返回了数千个条目,但通常只有 0 到 20 个。(整个表少于 3800 个条目)

SELECT serie.day AS time, count(t."createdAt") AS created
FROM (
   SELECT generate_series(
       to_timestamp(1518248353)::date,
       to_timestamp(1521469246)::date, 
       interval '1 day'
   ) AS day
   FROM users t
) serie
LEFT JOIN users t ON t."createdAt"::date = serie.day::date 
     WHERE state ILIKE 'rejected'
GROUP  BY serie.day
ORDER  BY time;

错误的结果:

2018-02-10 00:00:00+00  11619
2018-02-11 00:00:00+00  23238
2018-02-12 00:00:00+00  27111
2018-02-13 00:00:00+00  19365
2018-02-14 00:00:00+00  15492
2018-02-15 00:00:00+00  34857
2018-02-16 00:00:00+00  34857
2018-02-17 00:00:00+00  15492
2018-02-18 00:00:00+00  46476
2018-02-19 00:00:00+00  15492
2018-02-21 00:00:00+00  27111
2018-02-22 00:00:00+00  19365
2018-02-23 00:00:00+00  11619
2018-02-24 00:00:00+00  3873
2018-02-25 00:00:00+00  3873
...

预期结果如下:

2018-02-10 00:00:00+00  3
2018-02-11 00:00:00+00  9
2018-02-12 00:00:00+00  0
2018-02-13 00:00:00+00  19
2018-02-14 00:00:00+00  15
2018-02-15 00:00:00+00  3
2018-02-16 00:00:00+00  7
...

【问题讨论】:

请提供可重复的样品。 db-fiddle 或类似的 我不确定这个帖子是否可以提供帮助:postgresql.org/message-id/… 【参考方案1】:

为什么要将生成的系列加入子查询中的用户表?我认为这是你的问题。通常,当您使用generate_series() 时,您只需提供开始日期时间、结束日期时间和时间间隔,它就会将该系列生成为表格。

试试这个:

SELECT
    serie.day AS time,
    COUNT(t."createdAt") AS created
FROM (
    SELECT date_series::date AS day
    FROM generate_series(
        to_timestamp(1518248353)::date,
        to_timestamp(1521469246)::date,
        '1 day'
    ) AS date_series
) AS serie
LEFT JOIN users t ON t."createdAt"::date = serie.day::date 
    AND state ILIKE 'rejected'
GROUP  BY serie.day
ORDER  BY time;

【讨论】:

你已经很接近了,不要绝望 :) 这完全符合我的要求。

以上是关于Postgres,每天计数条目,包括没有的天数的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:优化查询“WHERE id IN (...)”

Postgres:计算子查询中的唯一数组条目

每天的 hsqldb 计数

在没有的查询的返回中插入日期

如何计算 Postgres 中两个日期之间除星期日以外的天数?

通过计算每组条目的天数差异来汇总系统状态中的天数