Вопрос SQL: количество появлений больше чем N в любой данный час - PullRequest
0 голосов
/ 15 декабря 2018

Я просматриваю журналы регистрации (в Netezza) и пытаюсь найти пользователей, которые имеют более определенного количества входов в систему в течение любого 1-часового периода (любого последовательного 60-минутного периода, в отличие от строго часового часа), так как1 декабряЯ просмотрел следующие сообщения, но большинство, похоже, посвящено поиску в определенном временном интервале, а не в ЛЮБОЙ данный период времени.Благодарю.https://dba.stackexchange.com/questions/137660/counting-number-of-occurences-in-a-time-period https://dba.stackexchange.com/questions/67881/calculating-the-maximum-seen-so-far-for-each-point-in-time Количество записей в час за промежуток времени

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вы можете использовать аналитическую функцию lag, чтобы просмотреть в отсортированной последовательности отметок времени, чтобы увидеть, находится ли запись, поступившая на 19 записей раньше, с разницей в часах:

with cte as (
    select   user_id,
             login_time,
             lag(login_time, 19) over (partition by user_id order by login_time) as lag_time
    from     userlog
    order by user_id,
             login_time
)
select   user_id,
         min(login_time) as login_time
from     cte
where    extract(epoch from (login_time - lag_time)) < 3600
group by user_id

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

0 голосов
/ 15 декабря 2018

Я думаю, вы могли бы сделать что-то подобное (для простоты я буду использовать таблицу входа с пользователем, datetime в качестве одного столбца):

with connections as (
  select ua.user
       , ua.datetime
  from user_logons  ua
  where ua.datetime >= timestamp'2018-12-01 00:00:00'
)
  select ua.user
       , ua.datetime
       , (select count(*) 
          from connections  ut 
          where ut.user = ua.user 
            and ut.datetime between ua.datetime and (ua.datetime + 1 hour)
         ) as consecutive_logons
       from connections ua
  1. Это дозаполнить ваши столбцы (пользователь, дата и время)
  2. Вы можете найти средства dateadd (ua.datetime + 1 час не будет работать);это более или менее зависит от реализации БД, например, это DATE_ADD в mySQL (https://www.w3schools.com/SQl/func_mysql_date_add.asp)
  3. Из-за подзапроса (select count(*) ...), весь запрос не будет самым быстрым, потому что этоосновной подзапрос - его необходимо переоценивать для каждой строки.
  4. with - это просто вычисление подмножества user_logons для минимизации его стоимости. Это может быть бесполезно, однако это уменьшит сложностьзапрос.

Вы можете повысить производительность, используя хранимую функцию или функцию, управляемую языком (например, java, php, ...).

...