给定开放和关闭日期,随着时间的推移生成开放票数
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
我有一些票据的一组数据,其中包含 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