给定开放和关闭日期,随着时间的推移生成开放票数

Generating counts of open tickets over time, given opened and closed dates

我有一些票据的一组数据,其中包含 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             |
+------------------+------------------+

我们想要生成 table 数据,显示按日期分组的一段时间内打开的工单总数。类似于以下内容:

+------------------+------------------+
|    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 中,所以我考虑过为此使用 window 函数,但尝试按日期截断会使它变得复杂。我曾尝试使用 generate_series 函数来创建要加入的日期系列,但是当我使用聚合函数时,我“失去”了对单个票证日期时间的访问权限。

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

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