如何解决如何计算每分钟时间间隔中sql中的并发预订数?
如果我有预定的开始和结束时间,如何计算每分钟的预定数量?我做了一个简化的数据库表,看起来像这样:
Start time | End time | booking |
--------------------------------------------------
2020-09-01 10:00 | 2020-09-01 10:10 | Booking 1 |
2020-09-01 10:00 | 2020-09-01 10:05 | Booking 2 |
2020-09-01 10:05 | 2020-09-01 10:10 | Booking 3 |
2020-09-01 10:09 | 2020-09-01 10:10 | Booking 4 |
我希望在给定的时间间隔(例如10:02-10:09)之间进行预订。结果应该是这样的:
所需结果
Time | count
-----------
10:02 | 2 |
10:03 | 2 |
10:04 | 2 |
10:05 | 3 |
10:06 | 2 |
10:07 | 2 |
10:08 | 2 |
10:09 | 3 |
问题
如何实现?今天,我将其导出到python,但是我认为应该可以直接在SQL中实现。
解决方法
您可以直接在数据上使用递归CTE:
articleGroups
Here是db 小提琴。
编辑:
在早期版本的MySQL中,拥有一个理货表格会有所帮助。您可以使用以下方法即时创建一个:
with recursive cte as (
select start_time,end_time
from t
union all
select start_time + interval 1 minute,end_time
from cte
where start_time < end_time
)
select start_time,count(*)
from cte
group by start_time
order by start_time;
您需要足够的数字以达到最大跨度,但是您可以这样做:
(select @rn := @rn + 1 as n
from t cross join
(select @rn := 0) params
) tally
,
您可以使用递归查询生成时间戳范围,然后取消数据透视表的连接:
with recursive dates (ts) as(
select '2020-09-01'
union all
select ts + interval 1 minute
from dates
where ts + itnerval 1 minute < '2020-09-02'
)
select d.ts,sum(t.cnt) over(order by d.ts) cnt
from dates d
left join (
select start_time ts,1 cnt from mytable
union all select end_time,-1 from mytable
) t on t.ts <= d.ts
如果要重复和/或在较长时间段内运行此命令,则最好在日历表中具体化日期范围,而不要使用递归查询。日历表在很长一段时间内每分钟有一行-假设有一个名为date_calendar
的表,您可以这样做:
select d.ts,sum(t.cnt) over(order by d.ts) cnt
from date_calendar d
left join (
select start_time ts,-1 from mytable
) t on t.ts <= d.ts
where d.ts >= '2020-09-01' and d.ts < '2020-09-02'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。