如何计算用户留存率
新增用户留存率=新增用户中登录用户数/新增用户数*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;
函数解释
##每天新增用户数据
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;
由于第一张表只存了当月数据,所以需要并上另外一张表数据结果去重
新增用户查询结果如下
![](https://img-blog.csdnimg.cn/f21deb62983546539d2d029d802c7f4c.png)
验证结果的正确性
![](https://img-blog.csdnimg.cn/4e73767bf7964cf8b055e8b925f5a95e.png)
![](https://img-blog.csdnimg.cn/0ccf4ffd6d6243a9b1c06a3ffc4db7ba.png)
前两条数据代表同一个用户不同日期登录,第一次登录2023-03-06,第二次登录2023-04-14
所以该用户新增的日期为2023-03-06.