Подсчет записей за скользящий период времени SQL (на основе последней записи)

#sql #oracle

#sql #Oracle

Вопрос:

Я относительно новичок в SQL и пытаюсь извлечь следующее из базы данных Oracle SQL.

Допустим, у меня есть таблица пользователей и время их входа в систему, которая выглядит следующим образом:

Имя LOG_IN Jim 13:00:05

Патрик 13:02:23

Стив 13:02:44

Эмма 13:03:16

Стив 13:04:44

Джим 13:04:05

Джим 13:05:05

Джим 13:05:06

Патрик 13:05:17

Эмма 13:05:18

Стив 13:08:13

Допустим, я хочу запустить отчет, в котором сообщается о последнем входе пользователя в систему и всех входах в систему, которые произошли за 5 минут до последнего входа в систему. Если бы я делал это на другом языке, я бы просто использовал for .. выполните цикл, чтобы получить последний логин, а затем вернуться к предыдущим логинам и сравнить, попадает ли время входа в систему в течение 5 минут. окно. Я не уверен, как я мог бы сделать то же самое с Oracle SQL. Например, для кого-то вроде Джима его последний вход в систему в 13: 05: 06, поэтому я бы хотел, чтобы все время, когда он входил в систему между 13: 00: 06 и 13: 05: 06, было бы: ‘

Имя LOG_IN

Джим 13:04:05

Джим 13:05:05

Джим 13:05:06

Таким образом, самый первый вход в систему (в 13:00: 05) не будет включен, потому что его нет в диапазоне.

Тот же отчет вернет результаты и для других пользователей, поэтому для Стива будет возвращено следующее:

Имя LOG_IN

Стив 13:04:44

Стив 13:08:13

И первый логин (в 13:02:44) не будет возвращен.

Когда я впервые посмотрел на это, я подумал, что требуется выполнить все транзакции в течение 5 минут с момента составления отчета, но с тех пор я узнал, что мне нужно выполнить этот расчет скользящего периода на основе последнего входа в систему.

Ответ №1:

 select Name, LOG_IN
    from <table_name> A where LOG_IN >
    (select max(LOG_IN) from <table_name> where Name=A.Name)-(1/24./60.*5.);
 

Вот ссылка на sqlfiddle:
http://sqlfiddle.com /#!4/b231e/11/0
(не знаю, как долго он будет постоянным …)

Комментарии:

1. Большое спасибо — это отлично работает! Еще одним условием, которое я хотел добавить, было возвращать только тех пользователей, которые вошли в систему не менее 3 раз в течение 5 минут, я обновил ваш sqlfiddle, чтобы получить это: выберите Name, Count( ) из bla A, где LOG_IN> (выберите max(LOG_IN) из bla, где Name=A.Name )-(1/24./60.*5.) группа по имени, имеющая count( )>= 3; и это работает — еще раз спасибо за вашу помощь!!