мне интересно, если его можно реализовать SQL-запрос, который будет действовать как своего род алгоритм для вычисления определенных фигур для меня, основываясь на следующую таблице:комплексы/алгоритмической SQL Query
Это первоначальный запрос,
SELECT Activity, TimeOfAction, Requestor
FROM EventLog
WHERE Requestor = 0
ORDER BY Requestor, TimeOfAction;
и образец данных, который возвращается,
Login 2010-05-28 15:52:50.590 0
Login 2010-05-28 15:52:50.873 0
Logout 2010-05-28 15:52:50.890 0
Logout 2010-05-28 16:22:57.983 0
Login 2010-05-29 11:29:36.967 0
Logout 2010-05-29 11:29:37.640 0
Как вы можете видеть, есть повторяющиеся подключения и отключения в этом наборе данных. Мне нужно рассчитать длину сеанса, взяв FIRST login и LAST logout, когда есть дубликаты. Таким образом, первая сессия, приведенные выше данные будут из,
5-28 15:52:50.590 to 5-28 16:22:57.983
Алгоритм примерно,
1) Заказать список логинов/выхода из системы по имени пользователя, а затем по времени действия
2) Если запись является логином, выполните поиск следующего выхода из системы, за которым следует сразу логин (для подтверждения его последнего выхода из всех дубликатов)
3) Используйте первый вход и последний выход для создания нового сеанса (длина время выхода из системы - время входа в систему)
4) Повторите
В настоящее время я просто реализую это в коде, но был интересен, если его можно даже в SQL (я не слишком хорошо знаком с SQL).
Спасибо, это довольно близко. Единственная проблема заключается в том, что часть min (TimeOfAction) из EventLog, где TimeOfAction> e1.TimeOfAction и Activity = 'Logout' возвращает первый следующий выход из системы. Если есть дубликаты журналов, мне нужен последний дубликат, но, очевидно, изменение min до max просто приведет к самому большому выходу из системы во всем наборе данных. – sean
Можно ли инкапсулировать в предложение where логику «следующего выхода из системы, за которым следует логин», а не только «следующий выход из системы, который больше, чем текущая запись входа»? Потому что я думаю, что это должно быть и то, и другое. Поскольку, если есть повторяющиеся выходы (а не только дублирование логинов), мне нужно захватить LAST-выход этих дубликатов, а не только следующий в наборе.IE, если у нас есть: Выход Выход (дублированные выходы) – sean
Истина. Изменение этого параметра в max() не будет работать в этом случае. Запрос просто соответствует каждой записи входа в запись Logout. Если я правильно понимаю вас, вы хотите, чтобы последняя запись Logout была непосредственно перед другой регистрационной записью, поскольку может произойти несколько выходов из системы? Это не имеет для меня никакого смысла, как пользователь может выйти из системы более одного раза без входа в систему снова? –