0

我需要获得按特定顺序排列一系列值的会话。

现在我有这个查询,它从原始数据返回每个用户的会话

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
4

1 回答 1

0

使用窗口函数进行第一次输出

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
于 2018-09-21T08:59:09.560 回答