Как получить строки в определенной последовательности значений?
Мне нужно, чтобы получить сессии, где я одна последовательность значений в определенном порядке.
Теперь у меня есть этот запрос, который возвращает сессии для каждого пользователя из необработанных данных
select user_id, page, happened_at
from db as u1
where exists
(select 1 from db as u2
where u1.user_id = u2.user_id
and u2.happened_at < (u1.happened_at + interval '1 hour') )
ORDER BY user_id, happened_at
LIMIT 100
Мне нужно получить набор результатов в формате, который является результатом подзапроса для группы сессий, которые я получаю по запросу выше.
Условия подзапроса - получить сеанс, в котором пользователь открыл страницу в определенном порядке. Например, значение страницы может быть - старт, работа, покупка, посадка, - пользователь должен пройти через каждую страницу в этом порядке во время сеанса. Он \ она все еще может встречать любые другие страницы между каждой из них, но должен пройти все эти страницы в этом порядке во время сеанса.
Как можно получить результат, который соответствует такому условию? Как я могу понять изменения значения страницы в определенном порядке во время сеанса?
Набор данных при первом запуске запроса:
user_id page happened_at
3,230 start 2017-03-01 15:10
3,230 work 2017-03-01 15:16
3,230 start 2017-03-01 15:16
3,230 preview 2017-03-01 17:12
3,230 work 2017-03-01 17:12
3,230 buying 2017-03-01 17:13
3,230 landing 2017-03-01 17:51
3,230 smt else 2017-03-01 17:52
3,230 any page 2017-03-01 17:56
3,230 lanidng 2017-03-01 18:03
Вывод (что я сейчас смотрю)
user_id page happened_at
3,230 start 2017-03-01 15:16
3,230 preview 2017-03-01 17:12
3,230 work 2017-03-01 17:12
3,230 buying 2017-03-01 17:13
3,230 landing 2017-03-01 17:51
Конечный результат
user_id session_start session_end
3,230 2017-03-01 15:16 2017-03-01 18:03
1 ответ
Использовать оконную функцию для 1-го выхода
select user_id,page,happened_at from
(
select user_id,page,happened_at, row_number() over(partition by user_id,page order by happened_at desc) rn from table
) t where rn=1
затем возьмите max() и min() этого запроса
with t1 as
(
select user_id,page,happened_at from
(
select user_id,page,happened_at, row_number() over(partition by user_id,page order by happened_at desc) rn from table
) t where rn=1
) select user_id,min(happened_at) session_start,
max(happened_at) as session_end from t1 group by user_id