首页 > 数据库 >SQL经典用法之用户连续访问区间记录

SQL经典用法之用户连续访问区间记录

时间:2022-09-03 21:24:24浏览次数:49  
标签:jiange 06 05 rng 用法 访问 2022 SQL start

案例:有一张DWS表记录了每个用户近30天活跃情况,需要通过该表记录得出用户近30天的连续访问间隔分布情况

逻辑梳理:

1,要通过埋点日志数据,筛选出最近30天的日志记录,然后按照用户ID分组,通过对用户活跃时间进行排序得出近30天的连续活跃区间情况:使用开窗函数ROW_NUMBER() 实现

得到如下一张表:

user_id  rng_start  rng_end  

uid01  2022-05-20  2022-05-26 

uid01  2022-05-29  2022-06-01

uid01  2022-06-03  2022-06-20

uid02  2022-05-22  2022-05-30

uid02  2022-06-03  2022-06-06

uid03  2022-05-20  2022-05-26

uid04  2022-06-03  2022-06-20

uid05  2022-06-19  2022-06-20

 

2,通过上面的表我们要得到下面这张表:

user_id  jiange_days  jiange_cnts

uid01  间隔0天  26

uid02  间隔0天  11

uid03  间隔0天  6

uid04  间隔0天  17

uid05  间隔0天  1

uid01  间隔2天  1

uid01  间隔3天  1

uid02  间隔4天  1

实现逻辑:

对每一个区间,x=rng_end rng_start ,得到:间隔0天,x次

对于相邻区间,y=rng_2_start - rng_1_end,下一个区间开始-上个区间结束,得到间隔y天,1次

--sqltext:

--隔0天的次数

select  user_id,

     0 as jiange_days,

     datediff(rng_end,rng_start)  as jiange_cnts

from  dws_api_uca_ rng

--隔n天的次数:lead() over()将两个相邻区间的结束 和起始放到一行

如:

user_id  rng_start  rng_end  lead(rng_start) over()

uid01  2022-05-20  2022-05-26  2022-05-29

uid01  2022-05-29  2022-06-01  2022-06-03

uid01  2022-06-03  2022-06-20  null

select   user_id,

     datediff(lead(rng_start) over(partition by user_id order by rng_start), rng_end)  as  jiange_days

from   dws_api_uca_ rng

3,合并间隔0天和间隔n天的数据

--隔0天的次数

select  user_id,

     concat('间隔',0,'天') as jiange_days,

     datediff(rng_end,rng_start)  as jiange_cnts

from  dws_api_uca_ rng

union all

select   user_id,

     concat('间隔',jiange_days,'天') as jiange_days ,

     sum(1) as jiange_cnts

from 

(select   user_id,

     datediff(lead(rng_start) over(partition by user_id order by rng_start), rng_end)  as  jiange_days

from   dws_api_uca_ rng

) t

where t.jiange_days is not null 

group by  user_id,jiange_days

 

 

 

 

 

 

搜索

复制

标签:jiange,06,05,rng,用法,访问,2022,SQL,start
From: https://www.cnblogs.com/db-record/p/16653309.html

相关文章

  • Linux top命令的用法详细详解
    Linuxtop命令的用法详细详解_xiaoL_clo的博客-CSDN博客_linuxtop命令的用法详细详解 https://blog.csdn.net/dxl342/article/details/53507673查看多核CPU命令mpstat......
  • 常用MySQL语句
    1.客户端登录在终端输入mysql-u[用户名]-p[密码] 2.数据库级别操作//创建数据库createdatabase[dbname];//查看数据库列表showdatabases;//选择数据......
  • Mysql第一部分
    MySQL基础-01一、数据库的基本概念1.为什么要学数据库?我们如果想将一些数据实现永久化存储,可以怎么做呢?没错。使用IO流的技术将数据保存到本地文件中但是接下来我有这......
  • Python爬虫-Pyquery的用法(四)
    一、PyQuery介绍与安装1、PyQuery简介PyQuery简介PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝......
  • [ Linux ] column 简明用法
    https://www.cnblogs.com/yeungchie/选项-c指定每一行输出的宽度。-t判断列来输出,对齐所有列。主要用到的就是这个选项。-s指定分隔符,默认为空白符。-o指定用于......
  • 【MySQL】order by引起的慢查询问题总结
    最近遇到了一个SQL没有走索引导致出现慢查询的问题,SQL本身很简单,两张表联合查询然后进行排序和分页,由于涉及到一些业务,这里以用户表和订单表为例,用户表数据在35W左右,订单表......
  • 今天开始学习mysql,遂先安装了Mysql 5.6.19 64bit 版本的数据库,结果安装成功了,但是使用
    Linuxmysql5.6:ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:NO)-潇湘隐者-博客园 https://www.cnblogs.com/kerrycode/p/38......
  • Linux 设置Apche+MySQL开机启动
    Linux下将Apache(httpd)新增为系统服务及开机自启动第2页_服务器应用_Linux公社-Linux系统门户网站 https://www.linuxidc.com/Linux/2012-11/74517p2.htmLinux设置Ap......
  • vscode连接sqlserver(以及一直正在扩展问题的解决方法)
    我又回来啦,时隔两年,我终于正式成为一名程序媛!电脑突然坏了,勉强抢修回来,师父说还在保修期内帮我返厂检修,但是在等待的时间,就说上班咱也不能摸鱼啊,还是想办法继续捣鼓点作业......
  • MySQL_1
    MySQL1.注释2.单行注释--:两个横线后面就是注释在Navicat中,ctrl+/快速注释在Navicat中按ctr+shiftl+/选中SQL代码取消注释3.常用数据类型整数:int,有符......