文章目录
- 题目需求
- 思路一
- 实现一
- 题目来源
题目需求
现有页面浏览记录表(page_view_events)如下,每行数据代表:每个用户的每次页面访问记录。
规定若同一用户的相邻两次访问记录时间间隔小于60s,则认为两次浏览记录属于同一会话。
现有如下需求,为属于同一会话的访问记录增加一个相同的会话id字段,会话id格式为"user_id-number",其中number从1开始,用于区分同一用户的不同会话。
期望结果如下(截取部分):
user_id (用户id) | page_id (页面id) | view_timestamp (浏览时间戳) | session_id (会话id) |
---|---|---|---|
100 | home | 1659950435 | 100-1 |
100 | good_search | 1659950446 | 100-1 |
100 | good_list | 1659950457 | 100-1 |
100 | home | 1659950541 | 100-2 |
100 | good_detail | 1659950552 | 100-2 |
100 | cart | 1659950563 | 100-2 |
需要用到的表:
页面浏览记录表:page_view_events
user_id | page_id | view_timestamp |
---|---|---|
100 | home | 1659950435 |
100 | good_search | 1659950446 |
100 | good_list | 1659950457 |
100 | home | 1659950541 |
100 | good_detail | 1659950552 |
思路一
实现一
-- 2) 为属于同一会话的访问记录增加一个相同的会话id字段,会话id格式为"user_id-number"
select user_id,
page_id,
view_timestamp,
-- 计算 session_id
concat(user_id, '-', sum(flag) over (partition by user_id order by view_timestamp)) as session_id
from (
select user_id,
page_id,
view_timestamp,
-- 1.1) 获取该用户上次页面浏览时间
-- 1.2)计算该用户 (本次页面浏览时间 - 上次页面浏览时间), if(本次页面浏览时间 - 上次页面浏览时间) > 60, 标记为1,否则为0
if(view_timestamp - lag(view_timestamp, 1, 0) over (partition by user_id order by view_timestamp) > 60,
1,
0) as flag
from page_view_events
) t1;
题目来源
http://practice.atguigu.cn/#/question/42/desc?qType=SQL