Добрый день.
Имеется такая таблица заходов пользователей на страницы:
happened_at
page
user_id
Из неё нужно вытащить сессии в виде: user_id, начало_сессии, конец_сессии. Сессия - последовательность заходов пользователя, между двумя последовательными заходами менее часа. Начинается с первого, а заканчивается через час после последнего.
Я написал запрос, но мне кажется он слишком сложный - с двумя подзапросами. Можно ли его как-нибудь упростить?
with t as(select user_id,page,happened_at,
happened_at - lag (happened_at) over (partition by user_id order by happened_at) is null or
happened_at - lag (happened_at) over (partition by user_id order by happened_at) > interval '1 hour' as is_session_start,
lead (happened_at) over (partition by user_id order by happened_at) - happened_at is null or
lead (happened_at) over (partition by user_id order by happened_at) - happened_at > interval '1 hour' as is_session_end
from test.vimbox_pages ),
tt as (select user_id,page,happened_at,is_session_start,is_session_end,
coalesce(lag (happened_at) over (partition by user_id order by happened_at), happened_at) as session_start
from t
where is_session_start=true or is_session_end=true)
select
user_id,
session_start,
happened_at as session_end
from tt
where is_session_end=true
order by user_id, session_start