SQL面试题挑战11:访问会话切割
问题
问题:如下为某电商公司用户访问网站的数据,包括用户id和访问时间两个字段。现有如下规则:如果某个用户的连续的访问记录时间间隔小于60秒,则属于同一个会话,现在需要计算每个用户有多少个会话。比如1001用户在第0秒,50秒,150秒有三次访问记录,则该用户有2个会话,其中第一个会话是第0秒和第50秒的记录,第二个会话是第150的记录。
user_id ts
1001 16920000000
1001 16920000050
1002 16920000065
1002 16920000080
1001 16920000150
1002 16920000160
建表语句
drop table if exists login_session;
create table login_session(
user_id varchar(20),
ts bigint
);
insert into login_session values
('1001','16920000000'),
('1001','16920000050'),
('1002','16920000065'),
('1002','16920000080'),
('1001','16920000150'),
('1002','16920000160'
解答
思路:
参考连续登录问题打标记的方式
完整查询如下
select
user_id,
sum(flag)cnt
from
(
select
user_id,
if(ts-lag(ts,1,0) over (partition by user_id order by ts)<60,0,1)flag
from
login_session
)t
group by
user_id