SQL-запрос для расчета продолжительности посещения из таблицы журнала - PullRequest
1 голос
/ 08 декабря 2008

У меня есть таблица MySQL LOGIN_LOG с полями ID, 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)

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

Ответы [ 4 ]

1 голос
/ 08 декабря 2008

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

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

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

0 голосов
/ 08 декабря 2008

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

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

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

0 голосов
/ 08 декабря 2008

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

0 голосов
/ 08 декабря 2008

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

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

...