Поиск максимального числа одновременных пользователей в таблице журнала сеансов - PullRequest
0 голосов
/ 07 января 2019

Мне нужно найти максимальное количество одновременных пользователей (с указанием даты и времени, если применимо)

У меня есть таблица t_sessions, содержащая 10 800 000 строк, например:

sesion_start      duration_in_sec  user_name
01/01/2019 01:00  280              a
01/01/2019 01:02  380              b
01/01/2019 01:01  1250             c

Мне нужно найти максимальное количество одновременных пользователей (с указанием даты и времени, если применимо) Я создал временную таблицу, t_times содержит все времена в секундах:

f_time
01/01/2019 00:00:01
01/01/2019 00:00:02
01/01/2019 00:00:03

select max(c) from
(select f_time, count(*) c
 from t_times a
 join t_sessions b 
     on a.f_time between sesion_start and
                         (sesion_start  + (duration_in_sec /86400))
 group by f_time)

Есть ли меньше затрат и лучший способ выполнить такой запрос?

1 Ответ

0 голосов
/ 07 января 2019

Да, вы можете использовать логику «вход / выход»:

with t as (
      select session_start as td, 1 as inc
      from t_sessions t
      union all
      select session_start + (duration_in_sec / (24*60*60)), inc  -- old-fashioned method.  I'm being lazy
              -1 as inc
      from t_sessions t
     )
select t.*
from (select t.*,
             row_number() over (order by num_concurrent desc) as seqnum
      from (select t.td, sum(inc) over (order by t.td) as num_concurrent
            from t
            order by num_concurrent desc
           ) t
      ) t
where seqnum = 1;

Это может привести к небольшим несоответствиям, не зависящим от единицы, в зависимости от того, включена ли секунда поиска в качестве параллельного пользователя.

Это также предполагает, что сеансы для одного пользователя не перекрываются, что подразумевается вашим запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...