问题描述:
判断同一个用户,如果连续访问的时间间隔小于60s,就认为是同一个会话,或者说划分到同一个组。
解决思路:
关键在于,找到开始不属于上一个会话,或者说不属于上一个组的那个时间点,所以就需要对每一行进行判断,如果他和上一个时间点还是属于同一组的,那就标记一个值,如果不是同一个组了,就需要标记一个明显可以区分开的值。其实这个思路类似于解决间断连续问题的思路。
如果这个时间差值小于60,我给标记一个1,大于60标记一个0
关键的地方来了!!之后我如果把这个标记累加起来【从最早之前到现在】,你可以发现是一个会话的,就是1,之后就会累加成2
这里需要学习的事情:
自己的思路只想到开窗然后多增加一列,但是不知道怎么处理如果大于60s的
这就用到增加一个标记1或者0,然后累加的思路
代码:
select user_id,
page_id,
view_timestamp,
sum(session_start_point) over (partition by user_id order by view_timestamp) session_id
from (
select user_id,
page_id,
view_timestamp,
if(view_timestamp-lagts>=60,1,0) session_start_point
from (
select user_id,
page_id,
view_timestamp,
lag(view_timestamp, 1, 0) over (partition by user_id order by view_timestamp) lagts
from page_view_events
) t1
) t2;