【问题标题】:Generating counts of open tickets over time, given opened and closed dates在给定开放和关闭日期的情况下,随时间生成开放票的计数
【发布时间】:2020-09-30 10:09:56
【问题描述】:

我有一些门票的数据集,其中包含打开和关闭时间的datetime(如果仍然打开,则为 NULL)。

+------------------+------------------+
|    opened_on     |    closed_on     |
+------------------+------------------+
| 2019-09-01 17:00 | 2020-01-01 13:37 |
| 2020-04-14 11:00 | 2020-05-14 14:19 |
| 2020-03-09 10:00 | NULL             |
+------------------+------------------+

我们希望生成一个数据表,显示按日期分组的按时间开放的票证总数。类似于以下内容:

+------------------+------------------+
|    date          |    num_open      |
+------------------+------------------+
| 2019-09-01 00:00 | 1                |
| 2020-09-02 00:00 | 1                |
| etc...           |                  |
| 2020-01-01 00:00 | 0                |
| 2020-01-02 00:00 | 0                |
| etc...           |                  |
| 2020-03-08 00:00 | 0                |
| 2020-03-09 00:00 | 1                |
| etc...           |                  |
| 2020-04-14 00:00 | 2                |
+------------------+------------------+

请注意,我不确定在给定日期如何考虑 num_open - 应该从日期结束或开始的角度考虑,即如果一个在同一天,应该算0吗?

这是在 Postgres 中,所以我考虑过为此使用窗口函数,但尝试按日期截断会使它变得复杂。我尝试使用 generate_series 函数创建要加入的日期系列,但是当我使用聚合函数时,我“失去”了对单个票证日期时间的访问权限。

【问题讨论】:

    标签: sql postgresql datetime count left-join


    【解决方案1】:

    您可以使用generate_series() 来构建日期列表,然后在不等式条件上使用left join 来带表:

    select s.dt, count(t.opened_on) num_open
    from generate_series(date '2019-09-01', date '2020-09-01', '1 day') s(dt)
    left join mytable t
        on s.dt >= t.opened_on and s.dt < coalesce(t.closed_on, 'infinity')
    group by s.dt
    

    实际上,这似乎更接近您想要的:

    select s.dt, count(t.opened_on) num_open
    from generate_series(date '2019-09-01', date '2020-09-01', '1 day') s(dt)
    left join mytable t
        on s.dt >= t.opened_on::date and s.dt < coalesce(t.closed_on::date, 'infinity')
    group by s.dt
    

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多