Вы можете справиться с этим, используя переменные или коррелированный подзапрос.Переменные обычно более эффективны:
select user_id, location, min(time), max(time),
timestampdiff(second, min(time), max(time)) as duration
from (select t.*,
(@grp := if(@ul = concat_ws(':', user_id, location), @grp,
if(@ul := concat_ws(':', user_id, location), @grp + 1, @grp + 1)
)
) as grp
from (select t.*
from t
order by user_id, time
) t cross join
(select @ul := '', @grp := 0) params
) t
group by user_id, location, grp;
Здесь - это скрипта SQL с рабочим кодом.