获取表中连续区间

获取表中连续区间

场景 1
前端日志 记录用户访问功能情况
用户会点击 功能A 操作一段时间 然后进入 功能B 操作一段时间 再 进入A操作一段时间
日志记录如下

时间用户功能事项
时间1用户A功能A操作事项X 第一次访问
时间2用户A功能A操作事项X 第一次访问
时间3用户A功能A操作事项X 第一次访问
时间4用户A功能B操作事项X
时间5用户A功能B操作事项X
时间6用户A功能B操作事项X
时间7用户A功能B操作事项X
时间8用户A功能A操作事项X 第二次访问
时间9用户A功能A操作事项X 第二次访问
时间10用户A功能A操作事项X 第二次访问
时间11用户A功能A操作事项X 第二次访问

为了获取在功能A上用了多少时间 (第一次访问 + 第二次访问)
或者 获取访问了多少次 (2次)
需要将日志中访问功能A 两次单独识别出来 单一 partition by 用户 功能 无法区分两次访问
网上搜的 且有效的方法
步骤一

SELECT 时间,
       用户,
       功能,
	   -- 在同一用户下 按照时间排序
       ROW_NUMBER() OVER(partition by 用户 ORDER BY 时间) AS rn,
	   -- 在同一用户,同一功能下 按照时间排序  相同功能 会按照时间顺序逐个 +1 前提是同一个用户下
       ROW_NUMBER() OVER(PARTITION BY 用户,功能 ORDER BY 时间) AS SN,
	   
	   -- 两者向减
	   -- 都是按照时间排序 但是略有不同 rn纯按照时间排序   sn 是功能内按照时间排序 
	   -- 两者相减  就会使  同一功能下 的差值是一样的(都是按照时间排序的) 
	   -- 如果功能A中有其他功能混入(中间又访问了功能B) RN正常随时间 +1 但是 SN 中partition by 用户,功能
	   -- 遇到功能B 的时候又开始按照功能B的序号往下排 
	   -- 当再遇到 功能A的时候 因为中间插入了几行功能B  RN 就比上次遇到 功能A的时候 大了几个数  在 - sn的时候就与之前
	   -- 上次遇到功能A的时候差值不一样了 根据同一功能 的差值不同 就可以区分不同访问次数
      ROW_NUMBER() OVER(partition by 用户 ORDER BY 时间)  - ROW_NUMBER() OVER(PARTITION BY 用户,功能  ORDER BY 时间) AS QJ
FROM 日志表 
ORDER BY 时间;

时间用户功能事项RNSNRN -SN
时间1用户A功能A操作事项X 第一次访问A110
时间2用户A功能A操作事项X 第一次访问A220
时间3用户A功能A操作事项X 第一次访问A330
时间4用户A功能B操作事项X 第一次访问B413
时间5用户A功能B操作事项X 第一次访问B523
时间6用户A功能B操作事项X 第一次访问B633
时间7用户A功能B操作事项X 第一次访问B743
时间8用户A功能A操作事项X 第二次访问A84(是A3+1)4
时间9用户A功能A操作事项X 第二次访问A954
时间10用户A功能A操作事项X 第二次访问A1064
时间11用户A功能A操作事项X 第二次访问A1174

最终脚本

select min(时间) as beg_date, -- 该区间 最小时间 及 开始时间
       max(时间) as end_date, -- 该区间 最大时间 及 结束时间
       用户,              
       功能,
       count(*) as "连续次数"  -- 该区间 日志表记录行数
from(SELECT 时间,
            用户,
            功能,
            ROW_NUMBER() OVER(partition by 用户 ORDER BY 时间) AS rn,
            ROW_NUMBER() OVER(PARTITION BY 用户,功能 ORDER BY 时间) AS SN,
            ROW_NUMBER() OVER(partition by 用户 ORDER BY 时间)  - ROW_NUMBER() OVER(PARTITION BY 用户,功能  ORDER BY 时间) AS QJ
       FROM 日志表 
      ORDER BY 时间)  
group by 
用户,功能,QJ;  -- 获取同一用户下各个区间功能的数据  必须分组中 把 功能,QJ都分组 才能确保 是连续区间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值