我是先学习了这位大神留存率的写法,然后我自己完善了一下。@阿柯@
首先声明一下留存的概念

  1. 次日留存:1月1日注册的新用户,在1月2日登陆了app。即登陆日期 - 注册日期 = 1天。
  2. 3日留存:1月1日注册的新用户,在1月3日登陆了app。即登陆日期 - 注册日期 = 2天。
  3. 7日留存:1月1日注册的新用户,在1月8日登陆了app。即登陆日期 - 注册日期 = 6天。
  4. 但是目前不同公司对留存的定义不太一样,所以以具体的规则为准,这里只是为了方便大家理解。

user_infor,包含user_id(用户ID)和reg_time(注册日期)的字段。

用户ID 注册时间
user_id reg_time

login_log,包含user_id(用户ID)和login_time(登录时间

用户ID 登录时间
user_id login_time

2张表的时间都是datetime类型 YYYY-MM-DD HH:MM:SS

首先在navicate中新建2张表,建表是从大神那里复制过来的。

-- 用户注册表
create table user_info(user_id varchar(10) primary key,reg_time datetime);insert into user_info values
('u_01','2020-01-01 09:15:00'),
('u_02','2020-01-01 00:04:00'),
('u_03','2020-01-01 22:16:00'),
('u_04','2020-01-01 20:32:00'),
('u_05','2020-01-01 13:59:00'),
('u_06','2020-01-01 21:28:00'),
('u_07','2020-01-01 14:03:00'),
('u_08','2020-01-01 11:00:00'),
('u_09','2020-01-01 23:57:00'),
('u_10','2020-01-01 04:46:00'),
('u_11','2020-01-02 14:21:00'),
('u_12','2020-01-02 11:15:00'),
('u_13','2020-01-02 07:26:00'),
('u_14','2020-01-02 10:34:00'),
('u_15','2020-01-02 08:22:00'),
('u_16','2020-01-02 14:23:00'),
('u_17','2020-01-03 09:20:00'),
('u_18','2020-01-03 11:21:00'),
('u_19','2020-01-03 12:17:00'),
('u_20','2020-01-03 15:26:00');-- 登陆日志表
create table login_log(user_id varchar(10),login_time datetime,primary key(user_id,login_time));insert into login_log values
('u_02','2020-01-02 00:14:00'),
('u_10','2020-01-02 08:32:00'),
('u_03','2020-01-02 09:20:00'),
('u_08','2020-01-02 10:07:00'),
('u_04','2020-01-02 10:29:00'),
('u_09','2020-01-02 11:45:00'),
('u_05','2020-01-02 12:19:00'),
('u_01','2020-01-02 14:29:00'),
('u_15','2020-01-03 00:26:00'),
('u_14','2020-01-03 11:18:00'),
('u_11','2020-01-03 13:18:00'),
('u_16','2020-01-03 14:33:00'),
('u_06','2020-01-04 07:51:00'),
('u_18','2020-01-04 08:11:00'),
('u_07','2020-01-04 09:27:00'),
('u_10','2020-01-04 10:59:00'),
('u_20','2020-01-04 11:51:00'),
('u_03','2020-01-04 12:37:00'),
('u_17','2020-01-04 15:07:00'),
('u_08','2020-01-04 16:35:00'),
('u_01','2020-01-04 19:29:00'),
('u_14','2020-01-05 08:03:00'),
('u_12','2020-01-05 10:27:00'),
('u_15','2020-01-05 16:33:00'),
('u_19','2020-01-06 09:03:00'),
('u_20','2020-01-06 15:26:00'),
('u_04','2020-01-08 11:03:00'),
('u_05','2020-01-08 12:54:00'),
('u_06','2020-01-08 19:22:00'),
('u_13','2020-01-09 10:20:00'),
('u_15','2020-01-09 16:40:00'),
('u_18','2020-01-10 21:34:00');

首先同步一下自己学习后的思路

  1. 把user_info的新增用户表作为左表
  2. 把login_log的登录表作为链接表
  3. 使用user_id将两个表做连接,这样每个用户第一次注册的记录就可以和用户以后的所有登录数据进行匹配上
  4. 这样就先形成了一个大表
    from user_info left join login_log on user_info.user_id = login_log.user_id
  5. 在大表的基础按照用户的注册日期进行分组
    group by date(user_info.reg_time)
  6. 这样同一天注册的用户被分在同一个组里面了
  7. 首先对每日新增的用户(左表中)进行计数,由于存在重复的数据所有要去重count(distinct user_info.user_id),这样就得到了每天的新增用户数。
  8. 使用sum(datediff(login_time, reg_time) = 1) as ‘次日留存用户数’ 来分别求的其他几个纬度的用户留存情况。
  9. 这里声明一下,为什么用sum()而非count()。sum(条件表达式),如果记录满足条件表达式就加1,统计满足条件的行数。 **COUNT(条件表达式),不管记录是否满足条件表达式,只要非NULL就加1。所以如果用count将计算所有的行数而非指定条件的行数。
  10. 留存率就是将n日用户留存数量 / 对应日期的新增用户数即可

最后的代码就是,我从大神那里复制来的。

select date(reg_time) dt,count(distinct user_info.user_id) 新增用户数,sum(datediff(login_time,reg_time)=1) 次日留存用户数,sum(datediff(login_time,reg_time)=3) 三日留存用户数,sum(datediff(login_time,reg_time)=7) 七日留存用户数,sum(datediff(login_time,reg_time)=1)/count(distinct user_info.user_id) 次日留存率,sum(datediff(login_time,reg_time)=3)/count(distinct user_info.user_id) 三日留存率,sum(datediff(login_time,reg_time)=7)/count(distinct user_info.user_id) 七日留存率
from user_info left join login_log on user_info.user_id=login_log.user_id
group by date(reg_time);
+------------+------------+----------------+----------------+----------------+------------+------------+------------+
| dt         | 新增用户数  | 次日留存用户数  | 三日留存用户数  | 七日留存用户数  | 次日留存率  | 三日留存率  | 七日留存率  |
+------------+------------+----------------+----------------+----------------+------------+------------+------------+
| 2020-01-01 |         10 |              8 |              6 |              3 |     0.8000 |     0.6000 |     0.3000 |
| 2020-01-02 |          6 |              4 |              3 |              2 |     0.6667 |     0.5000 |     0.3333 |
| 2020-01-03 |          4 |              3 |              2 |              1 |     0.7500 |     0.5000 |     0.2500 |
+------------+------------+----------------+----------------+----------------+------------+------------+------------+

我使用concat()与round()函数进行了简单的加工

concat(round(SUM(DATEDIFF(login_time, reg_time) = 1) / COUNT(DISTINCT user_info.user_id) * 100, 1), '%') AS '次日留存率',
concat(round(SUM(DATEDIFF(login_time, reg_time) = 7) / COUNT(DISTINCT user_info.user_id) * 100, 0), '%')AS '三日留存率',
concat(round(SUM(DATEDIFF(login_time, reg_time) = 7) / COUNT(DISTINCT user_info.user_id) * 100, 0), '%')AS '7日留存率'

这样就行变为百分数的形式了

mysql 用户留存率计算(每日新增DNU,次日留存率,3日留存率,7日留存率)相关推荐

  1. sql计算每日新增用户、及留存率指标

    show databases; -- 选择数据库进行建库 use tempt2022; -- 用户注册表 create table user_info(user_id varchar(10) prim ...

  2. 离线数仓——(新增用户业务指标,每日新增用户明细表,留存用户业务指标,用户留存明细表)

    文章目录 新增用户业务指标 每日新增用户明细表 留存用户业务指标 用户留存明细表 新增用户业务指标 留存用户:指某段时间的新增用户,经过一段时间后,仍继续使用应用认为是留存用户 新增会员:第一次使用应 ...

  3. 数据仓库之【用户行为数仓】08:【dws层:数据汇总层】【appc层:数据应用层】需求1:每日新增用户相关指标

    一.每日新增用户相关指标分析 在统计新增用户时,用户是以设备标识(xaid字段)来判断的,每一个设备都有一个唯一设备码. 因为会存在用户不登录的情况,以及多人共用一个账号的情况,所以根据用户id进行过 ...

  4. 计算某日新增用户,及其次日、3日、3日内的留存率

    计算某日新增用户,及其次日.3日及其3日内的留存率 user_id 用户 dt 时间 login 表名 select login_day,count(distinct t.user_id) as uv ...

  5. 每日新增用户的次日留存率

    每日新增用户的次日留存率 第一种办法,传统解法: 先去重,然后3个join selectlog_day '日期',count(user_id_d0) '新增数量',count(user_id_d1) ...

  6. Hive 计算用户留存率(次日,3日,N日)

    文章目录 什么是用户留存率? 创建数据源 计算留存率 计算 N 日的留存率 什么是用户留存率? 用户留存率是指在特定时间段内,用户在使用某个产品或应用程序后,再次使用该产品或应用程序的比例. 它可以帮 ...

  7. mysql怎么分组计算逾期率_Tableau分享第一篇:如何计算分组留存率(Cohort Analysis)!...

    衡量一款产品是否健康,用户的留存率是一个关键的指标,常见的有7日留存率,14天留存率,30天留存率,60天留存率等等.今天Tay哥先讲一下如何用Tableau做Cohort Analysis ,中文一 ...

  8. MySql 练习- 留存率计算

    MySql 练习- 留存率计算 最近开始每天抽空刷几道MySQL的题,还是要多实战练练,不然容易忘.今天分享一道MySQL里面的留存率计算 数据源:question_practice_detail i ...

  9. mysql 每日新增表分区

    1.创建表和表分区 DROP TABLE zy.time_partition; CREATE TABLE zy.time_partition (TIME DATETIME NOT NULL )ENGI ...

最新文章

  1. pdfh5.js 基于pdf.js和jQuery,web/h5/移动端PDF预览手势缩放插件。
  2. Revit二次开发之“选择某一楼层的墙”
  3. android获取手机通讯录
  4. 搜索引擎学习(六)Query的子类查询
  5. 设有两个16位整数变量A和B,试编写完成下述操作的程序。
  6. c语言数据结构系统化,C语言数据结构+数据库+操作系统
  7. Mysql找不到mysql.sock怎么办?
  8. 商标申请流程图及时间_长沙注册商标面要多长时间及注册申请流程
  9. 原生 遍历_迭代器模式统一集合的遍历方式
  10. windows之临时文件
  11. centos禁ping
  12. NE555脉冲模块电路
  13. Android图书馆选座系统课程设计
  14. 第三次个人作业——关于K米(Andorid)的案例分析
  15. 海龟编程计算机,第一个海龟程序
  16. 深入解读:从DDIM到Improved Denoising Diffusion Probabilistic Models
  17. FAT32、exFAT、NTFS
  18. HNUST OJ 1997 琪露诺的完美算术教室
  19. (可能是)最后一次参加同学婚礼了
  20. 【月刊】在四月奔跑起来,即使道路泥泞,也会收获遍野的烂漫

热门文章

  1. window权限 及c++实现 【网摘】(转)
  2. 回归问题--基本概念
  3. git:什么是git
  4. 数据库技术-数据库系统设计
  5. windows系统部署巡风扫描器
  6. 使用Lua执行一个Lua文件
  7. 人工智能和自动驾驶业务将是百度未来的最强增长动力
  8. IntelliJ IDEA Maven Project Dependencies红色波浪线报错
  9. webpack之externals解析
  10. Hystrix Dashboard使用及面板参数详述