Я бы отнесся к этому как к проблеме пробелов и островков.
Предполагая, что вы работаете MySQL 8.0, вы можете определить группы с суммой окон, которая увеличивается на 1
каждый раз, когда для данного пользователя наблюдается событие 'LOGIN'
:
select
user,
min(event_date) login,
min(case when event = 'LOGOUT' then event_date END) logout,
timediff(min(case when event = 'LOGOUT' then event_date END), min(event_date)) total_time
from (
select
t.*,
sum(case when event = 'LOGIN' then 1 else 0 end)
over(partition by user order by event_date) grp
from mytable t
) t
group by user, grp
order by user, login
Обратите внимание, что timediff()
обрабатывает длительности, которые не превышают около 838 часов. В противном случае вам нужно использовать timestampdiff()
или подобное.