MySQL实现7天,15天,30天,90天用户留存数量查询

如何计算用户留存率

新增用户留存率=新增用户中登录用户数/新增用户数*100%(一般统计周期为天)

新增用户数:在某个时间段(一般为第一整天)新登录应用的用户数;

登录用户数:登录应用后至当前时间,至少登录过一次的用户数;

第N日留存:指的是新增用户日之后的第N日依然登录的用户占新增用户的比例

第1日留存率(即“次留”):(当天新增的用户中,新增日之后的第1天还登录的用户数)/第一天新增总用户数;

第3日留存率:(当天新增的用户中,新增日之后的第3天还登录的用户数)/第一天新增总用户数;

第7日留存率:(当天新增的用户中,新增日之后的第7天还登录的用户数)/第一天新增总用户数;

第30日留存率:(当天新增的用户中,新增日之后的第30天还登录的用户数)/第一天新增总用户数;

查询SQL

SELECT
	create_time as '日期',
	count(id) '新增数量',
	count(id1)  '7日留存',
	count(id2) '15日留存',
	count(id3) '30日留存',
	count(id4)  '90日留存'
FROM
(SELECT	DISTINCT
	u.create_time,u.idx_user_id as id,u1.idx_user_id as id1,u2.idx_user_id as id2,u3.idx_user_id as id3,u4.idx_user_id as id4
FROM
(SELECT DISTINCT 
	min(Date(create_time)) create_time , idx_user_id,cost_status
FROM
	tbconsumerecord
WHERE 
cost_status=1 
GROUP BY 
	idx_user_id) u
LEFT JOIN 
	tbconsumerecord u1 
ON DATEDIFF(DATE(u1.create_time),u.create_time) = 7 AND u.idx_user_id=u1.idx_user_id
LEFT JOIN 
	tbconsumerecord u2 
ON DATEDIFF(DATE(u2.create_time),u.create_time) = 15 AND u.idx_user_id=u2.idx_user_id
LEFT JOIN 
	tbconsumerecord u3 
ON DATEDIFF(DATE(u3.create_time),u.create_time) = 30 AND u.idx_user_id=u3.idx_user_id
LEFT JOIN 
	tbconsumerecord u4
ON DATEDIFF(DATE(u4.create_time),u.create_time) = 90 AND u.idx_user_id=u4.idx_user_id
)as user
GROUP BY
create_time;

 

 

 函数解释

  • MySQL DATEDIFF函数计算两个DATE,或TIMESTAMP值之间的天数。

    MySQL DATEDIFF函数的语法如下:

  • 用于返回计算两个日期指定单位的时间差(指定单位可以是年,季度,月,星期,天数,小时,分钟,秒等等)

  • SELECT DATEDIFF('2023-06-12', '2023-06-05') as Intervaltime;

    输出结果:7

    ##日期函数 DATE_ADD(date,INTERVAL expr unit)  date 日期  INTERVAL expr 间隔 

    负数往前  正数往后 unit 时间单位 day 天 hour 小时 minute 分钟

    ##day 天

    select date_add('2023-06-10',INTERVAL '5' day) as afterDay;

     

    select date_add('2023-06-10',INTERVAL '-5' day) as beforeDay;

     

    ##hour 小时

    select date_add('2023-06-10',INTERVAL '5' hour) as afterHour;

     

    select date_add('2023-06-10',INTERVAL '-5' hour) as beforeHour;

     

    ##minute 分钟

    select date_add('2023-06-10',INTERVAL '5' minute) as afterMinute;

     

    select date_add('2023-06-10',INTERVAL '-5' minute) as beforeMinute;

     

 

##每天新增用户数据
select a.date, count(b.user_id) from
-- 日期表
(select distinct Date(create_time) as date from tbconsumerecord) a left join 
 -- 左连接日期不全的查询结果
(select idx_user_id user_id, min(Date(create_time)) as date from tbconsumerecord WHERE cost_status=1  group by idx_user_id ) b 
on a.date = b.date
group by a.date;

select *
FROM    tbconsumerecord
WHERE Date(create_time)='2023-03-06' or Date(create_time)='2023-04-14';

第一橙色部分含义:先查询该表所有日期

第二橙色部分含义:查询用户最小登录日期(当前用户第一次登录即为新增用户)

##每天新增用户数据
select a.date, count(b.user_id) as count from
-- 日期表
(select distinct Date(create_time) as date from tbconsumerecord 
union
select distinct Date(create_time) as date from tbconsumerecord_old
 ) a left join 
 -- 左连接日期不全的查询结果
(select idx_user_id user_id, max(Date(create_time)) as date from tbconsumerecord WHERE cost_status=1 group by idx_user_id
union
select idx_user_id user_id, max(Date(create_time)) as date from tbconsumerecord WHERE cost_status=1 group by idx_user_id

) b 
on a.date = b.date
group by a.date;

由于第一张表只存了当月数据,所以需要并上另外一张表数据结果去重

新增用户查询结果如下

 

验证结果的正确性

前两条数据代表同一个用户不同日期登录,第一次登录2023-03-06,第二次登录2023-04-14

所以该用户新增的日期为2023-03-06.

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值