Подсчитать максимальное количество перекрывающихся диапазонов дат в MySQL - PullRequest
1 голос
/ 09 марта 2020

У меня сильная головная боль в следующей ситуации. В 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)

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

Диапазон дат и времени - сеансы , Я хочу узнать следующее: каково максимальное количество сеансов, которые существовали за один раз?

Я нашел много вещей, например, как узнать, находится ли дата в диапазоне других дат и т. Д. c. что не очень помогло, так как я хочу узнать, сколько пользователей было на максимальном пике.

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Вот одна опция, использующая оконные функции (доступно в 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 в конце.

Затем вы можете вычислить количество одновременных сеансов в каждый момент времени с суммой окна.

Последний шаг - упорядочение по количеству сеансов и сохранение только первой строки.

1 голос
/ 09 марта 2020

Я бы сформулировал это как агрегат с оконной функцией:

select dt, sum(sum(inc)) over (order by dt) as overlapping
from (select starttt as dt, 1 as inc
      from mytable union all
      select endt, -1  as inc
      from mytable 
     ) t
group by dt
order by overlapping desc
limit 1;
...