SQL:批量获取次月留存和滚动留存

news2024/11/26 12:48:54

一、批量获取每月的次月留存率

问题描述:

现在有一份用户活跃数据,想要取每个月的用户在次月的留存,结果如下表

month活跃用户数次月留存用户数
2023-01100005000
2023-02110006000
2023-03150007500
...

思路:

先生成每个日期对应的上个月的月份

首先用当前日期减去当前天数,如2023-05-24,就减去24,可以得到上个月的月末:2023-04-30

然后将两个相同的活跃记录表相连,用a表的月份关联b表的上月即可

代码

with tmp as 
(select 
  date,--yyyy-mm-dd格式,如果是yyyymmdd需要转换
  substr(DATE,1,7) AS month,
  SUBSTR(date_sub(date,cast(substr(date,9,2) AS INT)),1,7) AS last_month--计算当前月份的上个月
  user_id
from table_name
where is_new=1#筛选新用户
)
select
a.month,
count(distinct a.user_id) as `当月新增用户数`
count(distinct b.user_id) as `次月留存用户数`
from
  (select user_id,month,last_month
  from tmp)a
left join 
  (select user_id,month,last_month
  from tmp)b
on a.user_id=b.user_id  and a.month=b.last_month
group by a.month

二、批量获取每日滚动30日留存

问题描述:

现在有一份用户活跃数据,想要取每个日滚动30日留存,以T日为例,取T-59~T-30日的活跃用户在 T-29~T的留存率

思路:

1、先生成一段连续的日期作为主表,如果没有现成的表可用,可以参考之前的文章,

先用space()函数生成一些空格;

再用split函数将空格划分;

再用lateral view explode()函数将其转置

再用row_number()over()函数生成序列得到连续数字

再用date_add()在日期上添加连续数字得到连续日期

SQL-不依赖任何表取连续数字和连续日期_格勒王的博客-CSDN博客取连续数字和日期,涉及到的知识点包括:date_add,sapce().split().lateral view explode(),row_number()over()https://blog.csdn.net/weixin_47198715/article/details/130828423?spm=1001.2014.3001.55022、用连续日期关联活跃数据,关联条件为

分母:aa.date>=date_sub(days.dt,59) and aa.date<=date_sub(days.dt,30)
分子:bb.date>=date_sub(days.dt,29) and bb.date<=days.dt and aa.user_id=bb.user_id

代码

select 
days.dt,
count(distinct aa.user_id) ,
count(distinct bb.user_id),
round(count(distinct bb.user_id)/count(distinct aa.user_id),2) as `滚动30日留存率`
from 
  (--取连续日期
  select 
  date_add('2022-12-31',row_number() over( ) ) as dt,
  row_number() over( ) as id 
  from 
  (SELECT SPLIT(SPACE(100),'') AS x)LATERAL VIEW explode(x)a
  )days

left join 
  (--取T-59~t-30日的活跃用户
    select
  date,
  user_id
  FROM table_name)aa on aa.date>=date_sub(days.dt,59) and aa.date<=date_sub(days.dt,30)

left join 

  (--取T-60~t-31日的活跃且在T-29~T还继续活跃的用户数
  select
  date,
  user_id
  FROM table_name)bb on bb.date>=date_sub(days.dt,29) and bb.date<=days.dt and aa.user_id=bb.user_id

group by days.dt


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop 原理介绍

1 文件系统和分布式文件系统 1.1 文件系统 文件系统&#xff1a;一种存储和组织数据的方法 实现了数据的存储、分级组织、访问、获取等操作使得用户对文件的访问和查找更容易使用树形目录的抽象概念代替了硬盘等物理设备中数据块的概念 ——>用户不必关系数据底层存在硬盘…

Java与分布式架构:微服务和RPC框架的应用和设计思路

章节一&#xff1a;引言 在当今互联网时代&#xff0c;大规模、高并发的应用成为了主流。为了应对这些挑战&#xff0c;软件架构趋向于分布式架构的设计。本文将重点讨论Java语言在分布式架构中的应用&#xff0c;以及微服务和RPC框架在设计中的关键思路和技术案例。 章节二&…

chatgpt赋能python:Python倒序排列的全面指南

Python倒序排列的全面指南 在Python中&#xff0c;几乎所有的数据结构都支持倒序排列。倒序排列是许多编程问题的解决方案&#xff0c;如查找最后一个元素&#xff0c;寻找最大值或最小值等等。在这篇文章中&#xff0c;我们将深入探讨Python中倒序排列的使用方法和技巧&#…

Flutter 笔记 | Flutter 核心原理(五)Box 布局模型和 Sliver 布局模型

根据前文我们已经从宏观上得知&#xff1a;Layout流程的本质是父节点向子节点传递自己的布局约束Constraints&#xff0c;子节点计算自身的大小&#xff08;Size&#xff09;&#xff0c;父节点再根据大小信息计算偏移&#xff08;Offset&#xff09;。在二维空间中&#xff0c…

Android逆向猿人学2022年app比赛第五题双向验证SSLpinning(步步验证)

SSLpinnig 前言一、起步二、抓包三、分析四、验证第一种方法&#xff1a;第二种方法&#xff1a; 借鉴 前言 这题在抓包方面会有点小问题&#xff0c;但是最后结果是正确出来了&#xff0c;如果有了解后面这个问题的读者&#xff0c;请多指教&#xff0c;十分感谢。 一、起步…

C Primer Plus第十五章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 由于使用的是命令行参数常用于linux系…

串口通信简介

1. 数据通信的基础概念 1.1 数据通信方式 按数据通信方式分类&#xff0c;可分为串行通信和并行通信两种。串行和并行的对比如下图所示&#xff1a; 串行通信的基本特征是数据逐位顺序依次传输&#xff0c;优点是传输线少、 布线成本低 、 灵活度高等优点&#xff0c;一般用…

docker架构速看(2)-镜像

docker架构细看(2)-镜像 ​ 上一章讲了Docker服务端的启动&#xff0c;这一章我们来看Docker中的镜像,需要对容器镜像分层存储&#xff0c;容器存储驱动有一定了解&#xff0c;参考 容器技术原理(一)&#xff1a;从根本上认识容器镜像 ​ Docker篇之镜像存储-OverlayFS和联合…

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO

JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO 这是一篇总结文章。 文章目录 JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO1、学习技术的梳理1.1、jdbc的引入1.2、ResultSet[结果集]1.3API小结 2、数据库连接池3、Apache公司的DBUtils工具-BasicDAO…

在页面上画一个三角形然后点击内部触发事件

在HTML页面上创建一个canvas元素。使用JavaScript绘制三角形并将其填充。您可以使用canvas的API来绘制形状&#xff0c;例如beginPath&#xff08;&#xff09;和lineTo&#xff08;&#xff09;等。将一个事件监听器绑定到canvas元素上&#xff0c;以便在单击三角形时触发事件…

Rust每日一练(Leetday0017) 字母异位词分组、幂函数、N皇后

目录 49. 字母异位词分组 Group Anagrams &#x1f31f;&#x1f31f; 50. 幂函数 Pow(x, n) &#x1f31f;&#x1f31f; 51. N 皇后 N-Queens &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日…

chatgpt赋能python:Python代码输出666——让你快速入门Python编程

Python代码输出666——让你快速入门Python编程 引言 Python是一种面向对象、解释型计算机程序设计语言。Python广泛应用于Web开发、科学计算、数据分析及人工智能等领域&#xff0c;具有优雅、明确、简单的特点&#xff0c;而且学习起来十分容易。如果你是一名初学者&#xf…

chatgpt赋能python:Python修改信息的方法和应用

Python修改信息的方法和应用 Python是一种简单易学、高效、功能强大的编程语言&#xff0c;被广泛应用于各种领域。其中&#xff0c;修改信息是Python最常用的功能之一。无论是在数据分析、网络爬虫还是Web开发中&#xff0c;我们都需要通过Python对数据进行修改、更新和删除等…

Jetson nano之ROS入门 - - 机器人建模与仿真

文章目录 前言一、URDF建模1. URDF语法详解a. robotb. linkc. joint 2. URDF机器人建模实操 二、Xacro宏优化1、 Xacro宏语法详解2、 Xacro建模实操 三、Rviz与Gazebo仿真1、Gazebo集成URDF建模语法基础2、Gazebo集成URDF实操 总结 前言 在ROS中&#xff0c;机器人建模和仿真是…

Spring(四)基于xml的自动装配

自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。 首先我们来熟悉三层架构的创建过程&#xff1a; 三层架构为controller层&#xff0c;service层&#xff0c;dao层。 在service层里面创建ser…

ShareX_一款好用的截图工具安装- Window

择心】向大家介绍and安装ShareX ShareX 免费、开源、轻量多区域截图无缝处理截图屏幕录制、文件共享各种实用工具&#xff08;如拾色器&#xff0c;屏幕拾色器&#xff0c;尺子&#xff0c;图像编辑器&#xff0c;图像合并&#xff0c;图像分割器&#xff0c;生成图像缩略图&am…

mysql学+练

从开始到放弃&#xff01; 开始 mysql -uroot -p123456退出命令 exit 或者 quit注释 # show databases; 单行注释 -- show databases; 单行注释 /* 多行注释 show databases; */DDL操作数据库 创建 /* 方式1 直接指定数据库名进行创建 */ CREATE DATABASE db1; /* 方式2 …

TerminalWorks TSPrint/TSScan/TSWebCam Crack

/ 远程桌面打印软件&#xff0c;TerminalWorks TSPrint Server/Client 从远程服务器打印到本地打印机的 简单方法 TSPrint 为您提供了一个简单的远程桌面打印软件&#xff0c;以及使 Windows 终端服务操作更容易的附加工具。有选择地启用或禁用功能&#xff0c;以便您可以完全…

Unity刚体

1、Dynamic&#xff1a;动态类型 受重力和力的影响移动和旋转 Material&#xff1a; 物理材质&#xff0c;在刚体上设置了物理材质&#xff0c;如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质 如果不设置&#xff0c;将使用在Physics 2D窗口中设置的默认材质(Physi…

python day1 函数

文章目录 前言一、python函数二、定义函数三、函数返回值四、实例五、变量作用域六、参数扩展1、默认值参数2、顺序参数&#xff0c;关键词参数3、可变参数4、可变关键词参数5、解包操作 七、函数类型的参数八、高阶函数九、匿名函数十、递归 前言 看深度学习的代码时&#xff…