Среднее значение 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 

person Dasha Dasha    schedule 20.03.2020    source источник
comment
Какую версию MySQL вы используете? Переменные устарели в самой последней версии.   -  person Gordon Linoff    schedule 20.03.2020


Ответы (1)


Чтобы получить медианное значение duration, "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.

использованная литература

person Jannes Botis    schedule 20.03.2020