【问题标题】:Sum of item count in an SQL query based on DATE_TRUNC基于 DATE_TRUNC 的 SQL 查询中的项目计数总和
【发布时间】:2020-04-25 01:55:44
【问题描述】:

我有一个包含事件状态数据的表,类似于:

  ID             Time               Status
------  --------------------------  ------
357920  2019-12-25 09:31:38.854764    1
362247  2020-01-02 09:31:42.498483    1
362248  2020-01-02 09:31:46.166916    1
362249  2020-01-02 09:31:47.430933    1
362300  2020-01-03 09:31:46.932333    1
362301  2020-01-03 09:31:47.231288    1

我想构造一个查询,返回每天成功事件的数量,所以:

         Time              Count
-------------------------- -----
2019-12-25 00:00:00.000000   1
2020-01-02 00:00:00.000000   3
2020-01-03 00:00:00.000000   2

我偶然发现this SO answer 遇到了一个类似的问题,但是查询返回的所有数据的答案都是如此,而我需要按日期范围分组的总和。

另外,我不能使用BETWEEN 选择特定日期范围,因为此查询是针对 Grafana 仪表板的,而日期范围由仪表板的 UI 确定。我将 Postgres 用于 SQL 方言,以防万一。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • @GordonLinoff 因为这个问题是关于 SQL 的,并且与 Postgres 没有特别的关系,所以我决定 not 用这个来标记这个问题。但可以肯定的是,您可能有一个好点,所以我会添加这个标签。 :)

标签: sql postgresql count sum


【解决方案1】:

这样怎么样:

SELECT date(Time), sum(status) 
FROM table 
GROUP BY date(Time)
ORDER BY min(Time)

【讨论】:

    【解决方案2】:

    您需要从time 组件中删除时间。在大多数数据库中,您可以通过转换为 date 来做到这一点:

    select cast(time as date) as dte, 
           sum(case when status = 1 then 1 else 0 end) as num_successful
    from t
    group by cast(time as date)
    order by dte;
    

    这假定1 表示“成功”。

    cast() 不适用于所有数据库。其他替代方案是 trunc(time)date_trunc('day', time)date_trunc(time, day) 之类的 - 毫无疑问还有很多其他选择。

    在 Postgres 中,我将其表述为:

    select date_trunc('day', time) as dte, 
           count(*) filter (where status = 1) as num_successful
    from t
    group by dte
    order by dte;
    

    【讨论】:

    • 谢谢!这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多