Среднее значение MySQL по продолжительности сеанса по группам (часы)
Мне нужно рассчитать медианное значение длины сеанса пользователя (ts_last-ts_first) по дням (ts_first) в MySQL. Пробую что-то подобное, но это не работает.
Спасибо!
SET @row_number:=0;
SET @medin_group:=’’;
SELECT @row_number:=CASE
WHEN @median_group= FROM_UNIXTIME(first_ts, '%t') THEN @row_number+1
ELSE 1
END AS count_by_time,
@median_group:= FROM_UNIXTIME(first_ts, '%t') AS median_group,
FROM_UNIXTIME(first_ts, '%t') AS by_time,
AVG(last_ts-first_ts) AS length,
(SELECT
COUNT (*)
FROM
User_sessions
WHERE
a.by_time=by_time) AS total_by_time
FROM
(SELECT FROM_UNIXTIME(first_ts, '%t') AS by_time, AVG(last_ts-first_ts) AS length
FROM
User_sessions
ORDERS BY by_time, length) AS
1 ответ
Чтобы получить медианное значение по продолжительности, "last_ts - first_ts", для таблицы User_sessions(ID, first_ts, last_ts):
Select MAX(totalSessions.duration) AS median
from
(
SELECT User_sessions.last_ts - User_sessions.first_ts AS duration, @counter := @counter +1 AS counter
FROM (select @counter:=0) initvar, User_sessions
ORDER BY duration ASC
) totalSessions
where (50/100 * @counter) > counter
Это работает:
1) Внутренний выбор: назначение инкрементного счетчика для каждой строки User_sessions, упорядоченных по продолжительности,
lowest duration counter=1
2nd lowest counter=2
3rd lowest counter=3
2) В конце @counter = общее количество строк User_sessions.
3) Внешний выбор, фильтрует строки с помощью counter <@counter.
Ссылки