文章目录
- 题目需求
- 思路一
- 实现一
- 题目来源
 
 
 
题目需求
现有页面浏览记录表(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



















