SQL速算N日留存

news/2024/11/28 6:49:18/

之前才哥发布了《用SQL进行用户留存率计算》

链接:https://mp.weixin.qq.com/s/QJ8JUO00bVJe_K6sx_ttaw

简化数据后得到如下结构的数据:

image-20230104202920257

由于用户和登录日期被设置为主键所以不需要再进行去重,下面看看如何快速求七日留存。

数据下载地址:https://gitcode.net/as604049322/blog_data/-/blob/master/role_login.sql

首先我们求每个用户的安装日期和第几天仍然再登录:

select role_id,install_date,datediff(b.event_date,install_date) day_diff
from (selectrole_id,min(event_date) install_datefrom role_login group by role_id
) a join role_login b using(role_id);

然后我们一口气求得七日留存:

with cte as (select role_id,install_date,datediff(b.event_date,install_date) day_difffrom (selectrole_id,min(event_date) install_datefrom role_login group by role_id) a join role_login b using(role_id)
)
select install_date,sum(day_diff=0) 新增用户数,sum(day_diff=1) 次日留存,sum(day_diff=2) 2日留存,sum(day_diff=3) 3日留存,sum(day_diff=4) 4日留存,sum(day_diff=5) 5日留存,sum(day_diff=6) 6日留存,sum(day_diff=7) 7日留存,concat(round(sum(day_diff=1)*100/sum(day_diff=0),2),"%") 次日留存率,concat(round(sum(day_diff=2)*100/sum(day_diff=0),2),"%") 2日留存率,concat(round(sum(day_diff=3)*100/sum(day_diff=0),2),"%") 3日留存率,concat(round(sum(day_diff=4)*100/sum(day_diff=0),2),"%") 4日留存率,concat(round(sum(day_diff=5)*100/sum(day_diff=0),2),"%") 5日留存率,concat(round(sum(day_diff=6)*100/sum(day_diff=0),2),"%") 6日留存率,concat(round(sum(day_diff=7)*100/sum(day_diff=0),2),"%") 7日留存率
from cte where day_diff<=7
group by 1 order by 1;

image-20230104203625784

可以看到,就这样轻松的计算出了7日留存率。按照上面SQL的思路可以轻松任意日的留存率。

本题相当于《SQL刷题宝典-MySQL速通力扣困难题》一文中,其他-》游戏玩法分析5的扩展。

更全面的各类SQL题,详见:

SQL刷题宝典-MySQL速通力扣困难题
https://xxmdmst.blog.csdn.net/article/details/128509713


http://www.ppmy.cn/news/9360.html

相关文章

Linux内核时间有关的API

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、延迟函数占用CPU的延迟:不占用CPU的延迟:单位换算二、获取时间点函数获得开机到现在总共的时间获得自1970年到现在时间三、定时器有关的函数初始化相关API时间拍转化API使用代码总结前言…

智能车|ROS主控与STM32建立通信软硬件全方位讲解

智能车|ROS主控与STM32建立通信软硬件全方位讲解前言智能车控制器功能通信内容硬件连接软件设置更新电平转换芯片的serial创建设备别名使用设备别名ROS与STM32串口通信代码ROS主控读取stm32发送的数据ROS主控向stm32发送数据前言 通常复杂的机器人会存在多个控制器&#xff0c;…

栈变量的作用域

C++自学精简教程 目录(必读) 栈变量的作用域就是栈变量的可见范围。 变量的作用域主要有下面几种常见的情况: 1 for循环作用域 变量只在for循环内部可见。 intmain(){//这里i不可见 for(inti=0;i<10;++i)//for循环内部可见 {cout<<

linux下常用调试技巧

1 linux下如何查看静态库和动态库都链接了那些库 1.1 静态库.a是没有指令可以看到其在生成过程中链接了那些库的 1.2 动态库.so可以通过ldd指令查看其在生成过程中链接了那些库 还有一种简单直观的方法,我们可以在编译过程中看到所生成的二进制文件,链接了那些库: 平时编译…

C++静态变量的使用训练

李太白年龄:80 加入列表后,最小的年龄现在是:80赵四天年龄:70 加入列表后,最小的年龄现在是:70王天霸年龄:90 加入列表后,最小的年龄现在是:70毛强年龄:20 加入列表后,最小的年龄现在是:20周瑜年龄:30 加入列表后,最小的年龄现在是:20万茜年龄:40 加入列表后,最小的年龄现在是:…

【 java 集合】List接口常用实现类对比以及ArrayList和LinkedList源码分析

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

【机器学习】线性回归损失函数为什么要用平方形式

问题 线性回归损失函数为什么要用平方形式&#xff1f; 问题背景 这是在阿里一面中遇到的问题&#xff0c;当时我的回答是损失函数是是模型预测值与真实值之间的一种距离度量&#xff0c;我们可以计算出每个样本的预测值与真实值之间的距离&#xff0c;全部加起来就得到了所…

【MySQL】-【索引】

目录为什么使用索引InnoDB中索引的推演索引前的查找设计索引简单的索引设计方案InnoDB中的索引方案为什么使用索引 一、hashmap底层使用红黑树 二、索引时在存储引擎中实现的&#xff0c;因此不同存储引擎的索引可能不同 索引的优点&#xff1a; 类似大学图书馆建书目索引&am…