2008-12-08 5 views
1

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

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

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) 

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

ответ

1

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

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

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

0

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

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

0

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

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^