Как получить строки в определенной последовательности значений? - PullRequest
0 голосов
/ 21 сентября 2018

Мне нужно получить сеансы, где у меня одна последовательность значений в определенном порядке.

Теперь у меня есть этот запрос, который возвращает сеансы для каждого пользователя из необработанных данных

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 Ответ

0 голосов
/ 21 сентября 2018

используйте оконную функцию для 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
...