Количество строк на пользователя и событие, чтобы добраться до номеров событий. Затем событие присоединения начинается с окончания события.
with s as
(
select
[user], timestamp,
row_number() over (partition by [user] order by timestamp) as event_number
from mytable
where event = 'Start'
)
, e as
(
select
[user], timestamp,
row_number() over (partition by [user] order by timestamp) as event_number
from mytable
where event = 'End'
)
select s.[user], s.timestamp as start_time, e.timestamp as end_time
from s
join e on e.[user] = s.[user] and e.event_number = s.event_number
order by start_time;
Используйте левое внешнее объединение, если вы хотите показать события, которые начались, но еще не завершились.
Этот запрос также допускает параллельные события (т. е. пользователь запускает событие, затем другой пользователь запускает событие до того, как первый пользователь заканчивает свое).
В запросе не учитываются пропущенные события, например, пользователь запускает событие, но когда он конец, это не записано в таблице. Затем пользователь запускает новое событие и завершает его, и мой запрос свяжет конец второго события с началом первого события.