计算MySQL中重叠日期范围的最大数量

我对以下情况感到头疼。在MySQL中,我有一个表,其中包含超过40000个条目,如下所示:

create table if not exists sessions

(

startt datetime null,

endt datetime null,

id int auto_increment

primary key

);

INSERT INTO sessions (startt, endt, id) VALUES

('2020-02-06 10:33:55', '2020-02-06 10:34:41', 20356),

('2020-02-06 10:33:14', '2020-02-06 10:33:57', 20355),

('2020-02-06 10:32:55', '2020-02-06 10:33:32', 20354),

('2020-02-06 10:33:03', '2020-02-06 10:33:12', 20353),

('2020-02-06 10:31:38', '2020-02-06 10:32:41', 20352),

('2020-02-06 09:48:44', '2020-02-06 09:50:37', 20351);

SELECT * FROM sessions;

+---------------------+---------------------+-------+

| startt | endt | id |

+---------------------+---------------------+-------+

| 2020-02-06 10:33:55 | 2020-02-06 10:34:41 | 20356 |

| 2020-02-06 10:33:14 | 2020-02-06 10:33:57 | 20355 |

| 2020-02-06 10:32:55 | 2020-02-06 10:33:32 | 20354 |

| 2020-02-06 10:33:03 | 2020-02-06 10:33:12 | 20353 |

| 2020-02-06 10:31:38 | 2020-02-06 10:32:41 | 20352 |

| 2020-02-06 09:48:44 | 2020-02-06 09:50:37 | 20351 |

+---------------------+---------------------+-------+

6 rows in set (0.00 sec)

小提琴https://www.db-fiddle.com/f/49bNZ7863gv6RThoPpuiid/0

日期和时间范围是会话。我要查找的是:一次最多可以存在多少个会话?

我发现了很多事情,例如如何确定某个日期是否在其他日期范围之内,等等,这并没有真正的帮助,因为我想找出最大高峰期的用户数。

回答:

这是一个使用窗口函数的选项(在MySQL 8.0中可用):

select dt, sum(nb) over(order by dt) sum_nb

from (

select starttt dt, 1 nb from mytable

union all select endt, -1 from mytable

) t

order by sum_nb desc

limit 1

想法是取消数据集的透视;并发会话数在每个会话开始时增加1,并在其结束时减少1。

然后,您可以使用窗口总和来计算每个时间点的并发会话数。

最后一步是按会话计数排序,并仅保留第一行。

以上是 计算MySQL中重叠日期范围的最大数量 的全部内容, 来源链接: utcz.com/qa/412039.html

回到顶部