#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; и это работает — еще раз спасибо за вашу помощь!!