SQL面试题挑战11:访问会话切割

问题:

如下为某电商公司用户访问网站的数据,包括用户id和访问时间两个字段。现有如下规则:如果某个用户的连续的访问记录时间间隔小于60秒,则属于同一个会话,现在需要计算每个用户有多少个会话。比如A用户在第1秒,60秒,200秒,230秒有三次访问记录,则该用户有2个会话,其中第一个会话是第1秒和第60秒的记录,第二个会话是第200秒和230秒的记录。


user_id     ts
1001    16920000000
1001    16920000050
1002    16920000065
1002    16920000080
1001    16920000150
1002    16920000160

SQL解答:

先按用户分组、时间排序后取每行数据的前一行的时间,然后判断当前行的时间与前一行时间的差值,看是否在给定的范围内,然后再做开窗累加就可以得到每个用户不同的会话编号了。思路如下图:

user_id ts 判断与上一行差值是否小于60 开窗累加当做会话编号
A 1 0 0
A 60 0 0
A 200 1 1
A 230 0 1
with tmp as (
    select 1001 as user_id,16920000000 as ts
    union all
    select 1001 as user_id,16920000050 as ts
    union all
    select 1002 as user_id,16920000065 as ts
    union all
    select 1002 as user_id,16920000080 as ts
    union all
    select 1001 as user_id,16920000150 as ts
    union all
    select 1002 as user_id,16920000160 as ts
)
 
select
	user_id
	,count(distinct user_group) as user_group_cnt
from
(
 select
    user_id
    ,ts
    -- 开窗做累加
    ,sum(flag) over(partition by user_id order by ts) as user_group
    from
    (
select
        user_id
        ,ts
        -- 判断当前行的时间与上一行的差值
        ,if(ts-last_ts<60,0,1) as flag
        from
        (
select
 user_id
 ,ts
 -- 取当前行的上一个时间,没有上一行就给自身的时间
 ,lag(ts,1,ts) over(partition by user_id order by ts) as last_ts
 from tmp
)t1
)t1
)t1
group by user_id;

相关推荐

  1. SQL面试挑战11访问会话切割

    2023-12-29 10:30:03       51 阅读
  2. SQL面试挑战13:分组topN

    2023-12-29 10:30:03       65 阅读
  3. SQL面试挑战14:每年的在校人数

    2023-12-29 10:30:03       59 阅读
  4. SQL面试挑战10:累计占比

    2023-12-29 10:30:03       58 阅读
  5. SQL面试挑战15sql实现分钟级的趋势图

    2023-12-29 10:30:03       54 阅读
  6. SQL面试挑战03:奖金瓜分问题(拼多多)

    2023-12-29 10:30:03       57 阅读
  7. SQL面试挑战06:互相关注的人

    2023-12-29 10:30:03       51 阅读
  8. SQL面试挑战02:同时最大在线人数问题

    2023-12-29 10:30:03       64 阅读
  9. SQL面试挑战04:找出使用相同ip的用户

    2023-12-29 10:30:03       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 10:30:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 10:30:03       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 10:30:03       82 阅读
  4. Python语言-面向对象

    2023-12-29 10:30:03       91 阅读

热门阅读

  1. HarmonyOS(Stage模型)app-json5

    2023-12-29 10:30:03       61 阅读
  2. 限制哪些IP能连接postgre

    2023-12-29 10:30:03       54 阅读
  3. STL 之 vector 通俗理解

    2023-12-29 10:30:03       47 阅读
  4. 基于matlab的一维多节数组排序

    2023-12-29 10:30:03       46 阅读
  5. 用VSCode Remote-SSH做Docker环境中的开发

    2023-12-29 10:30:03       59 阅读
  6. centos 编译安装 icu

    2023-12-29 10:30:03       67 阅读
  7. SQL高级:递归查询

    2023-12-29 10:30:03       56 阅读