SQL (MySQL) 的日期范围直方图
Daterange histogram with SQL (MySQL)
我有一个 table 日期范围如下:
start | end
2020-07-25 20:37:00 2020-07-25 20:44:00
2020-07-25 21:37:00 2020-07-25 22:44:00
2020-07-26 07:11:00 2020-07-27 10:50:00
...
最后,我想要一个直方图,显示一天中每小时有多少日期范围“重叠”。
因此生成的直方图由 24 个柱组成。
如何在 SQL 中为 MySQL 执行此操作? (旁注:我正在使用 TypeORM,但我能够编写普通的 SQL 语句)
我只找到了根据 TIMESTAMPDIFF
的各个间隔的长度计算和分组的解决方案,但这不是我想要实现的。
将来我可能想要显示相同的直方图,而不是每小时,而是一天中的每分钟或一个月中的每一天,依此类推。但是我认为一旦我了解查询的想法就很容易做到:)
一种方法是暴力法:
with recursive hours as (
select 0 as hh
union all
select hh + 1
from hours
where hh < 23
)
select h.hh, count(t.start)
from hours h left join
t
on start >= '2020-07-25' + interval h.hh hour and
end < '2020-07-25' + interval (h.hh + 1) hour
where end < '2020-07-25' + interval 1 day and
start >= '2020-07-25'
group by h.hh
order by h.hh;
我有一个 table 日期范围如下:
start | end
2020-07-25 20:37:00 2020-07-25 20:44:00
2020-07-25 21:37:00 2020-07-25 22:44:00
2020-07-26 07:11:00 2020-07-27 10:50:00
...
最后,我想要一个直方图,显示一天中每小时有多少日期范围“重叠”。 因此生成的直方图由 24 个柱组成。
如何在 SQL 中为 MySQL 执行此操作? (旁注:我正在使用 TypeORM,但我能够编写普通的 SQL 语句)
我只找到了根据 TIMESTAMPDIFF
的各个间隔的长度计算和分组的解决方案,但这不是我想要实现的。
将来我可能想要显示相同的直方图,而不是每小时,而是一天中的每分钟或一个月中的每一天,依此类推。但是我认为一旦我了解查询的想法就很容易做到:)
一种方法是暴力法:
with recursive hours as (
select 0 as hh
union all
select hh + 1
from hours
where hh < 23
)
select h.hh, count(t.start)
from hours h left join
t
on start >= '2020-07-25' + interval h.hh hour and
end < '2020-07-25' + interval (h.hh + 1) hour
where end < '2020-07-25' + interval 1 day and
start >= '2020-07-25'
group by h.hh
order by h.hh;