SQL-запрос для расчета продолжительности посещения из таблицы журнала

У меня есть таблица MySQL LOGIN_LOG с идентификатором полей, PLAYER, TIMESTAMP и ACTION. ДЕЙСТВИЕ может быть либо «войти», либо «выйти из системы». Только около 20% логинов имеют соответствующую строку выхода. Для тех, кто это делает, я хочу рассчитать среднюю продолжительность.

Я думаю о чем-то вроде

select avg(LL2.TIMESTAMP - LL1.TIMESTAMP)
from LOGIN_LOG LL1
inner join LOGIN_LOG LL2 on LL1.PLAYER = LL2.PLAYER and LL2.TIMESTAMP > LL1.TIMESTAMP
left join LOGIN_LOG LL3 on LL3.PLAYER = LL1.PLAYER
  and LL3.TIMESTAMP between LL1.TIMESTAMP + 1 and LL2.TIMESTAMP - 1
  and LL3.ACTION = 'login'
where LL1.ACTION = 'login' and LL2.ACTION = 'logout' and isnull(LL3.ID)

это лучший способ сделать это или есть еще один эффективный?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
4 164
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

У вас есть объект типа SessionManager, который может отключать сеансы по таймауту? Потому что там может быть зарегистрирован тайм-аут, и вы можете узнать время последней активности и период тайм-аута.

Или вы регистрируете все действия на веб-сайте / сервисе и, таким образом, можете напрямую запрашивать продолжительность посещения веб-сайта / услуги и видеть, какие действия они выполняли. Для веб-сайта анализаторы журналов Apache, вероятно, могут генерировать необходимую статистику.

Я согласен с JeeBee, но еще одним преимуществом объекта типа SessionManager является то, что вы можете обрабатывать событие sessionEnd и писать строку выхода с активным временем в нем. Таким образом, вы, вероятно, перейдете от 20% сопровождающих строк выхода к 100% сопутствующих строк выхода. Тогда запрос времени активности будет тривиальным и согласованным для всех сеансов.

Ответ принят как подходящий

Учитывая имеющиеся у вас данные, вы, вероятно, не сможете сделать что-либо намного быстрее, потому что вам нужно посмотреть на записи LOGIN и LOGOUT и убедиться, что между ними нет другой записи LOGIN (или LOGOUT?) Для одного и того же пользователя. .

В качестве альтернативы найдите способ гарантировать, что отключение записывает выход из системы, чтобы данные были полными (а не на 20%). Однако запрос, вероятно, по-прежнему должен обеспечивать соблюдение всех критериев, поэтому он не сильно поможет запросу.

Если вы можете получить данные в формате, в котором время входа в систему и соответствующее время выхода из системы находятся в одной записи, вы можете значительно упростить запрос. Я не понимаю, делает ли это SessionManager за вас.

Если только 20% ваших пользователей действительно выходят из системы, этот поиск не даст вам очень точного времени каждого сеанса. Лучший способ определить, как долго длится средний сеанс пользователя, - это определить среднее время между действиями или avg. раз на страницу. Затем это можно умножить на среднее количество страниц / действий за посещение, чтобы получить более точное время.

Кроме того, вы можете определить средн. время для каждой страницы, а затем получите время окончания сеанса = время сеанса до этой точки + среднее время, потраченное на их последней странице. Это даст вам более детальную (и точную) оценку времени, затраченного на сеанс.

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

Другие вопросы по теме