Alexeytur
@Alexeytur

Можно ли упростить SQL-запрос?

Добрый день.
Имеется такая таблица заходов пользователей на страницы:
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
  • Вопрос задан
  • 730 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ManBuisness
А можете подробнее объяснить решение?
А если не трудно, то напишите мне в telegram @ilya8960
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы