sql计算留存率

什么是留存率

  • 留存用户是指用户在APP产生行为后,在固定的第N日继续访问或使用APP的用户。留存率是指用户在一段时间后或固定的间隔后产生留存用户的比例。

  • 用户留存率有很多种:新客留存率、老客留存率、活跃用户留存率、购买留存率、或者某个功能使用用户的留存率等。

  • 通常计算的时间间隔为次日、3日、7日、30日、60日,根据业务不同需求可以选择不同的计算方式以及时间间隔,重点是要和产品负责人以及运营人员对好指标口径。

案例1

  • 公式

N日新客留存率=某日的新注册用户在第N日访问过APP的留存用户数 / 某日的新注册用户总数。

  • 数据
DROP TABLE user_info;
create table user_info(
    user_id varchar(10),
    login_date 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'),
('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');
  • 代码
WITH a AS (
    SELECT DISTINCT user_id, -- 防止一个用户一天内多次登录
                    login_date,
                    register_date,
                    DATEDIFF(login_date, register_date) date_diff -- 登陆日期和注册日期的差
    FROM (SELECT user_id,
                 DATE(login_date) login_date,
                 MIN(DATE(login_date)) OVER (PARTITION BY user_id) AS register_date -- 最小登陆日期即为注册日期
          FROM user_info) t1
)
SELECT register_date,
       COUNT(DISTINCT user_id)                                     AS                                  DAU,
       COUNT(CASE WHEN date_diff = 1 THEN a.user_id ELSE NULL END) AS                                  "次日留存数",
       COUNT(CASE WHEN date_diff = 3 THEN a.user_id ELSE NULL END) AS                                  "3日留存数",
       COUNT(CASE WHEN date_diff = 7 THEN a.user_id ELSE NULL END) AS                                  "7日留存数",
       ROUND(COUNT(CASE WHEN date_diff = 1 THEN a.user_id ELSE NULL END) / COUNT(DISTINCT user_id), 2) "次日留存率",
       ROUND(COUNT(CASE WHEN date_diff = 3 THEN a.user_id ELSE NULL END) / COUNT(DISTINCT user_id), 2) "3日留存率",
       ROUND(COUNT(CASE WHEN date_diff = 7 THEN a.user_id ELSE NULL END) / COUNT(DISTINCT user_id), 2) "7日留存率"
FROM a
GROUP BY register_date
;
  • 效果
    在这里插入图片描述

案例2

  • 公式

N日新客留存率=某日的新注册用户在第N日内访问过APP的留存用户数 / 某日的新注册用户总数。

  • 数据
    同案例一
  • 代码
WITH a AS (
    SELECT DISTINCT user_id, -- 防止一个用户一天内多次登录
                    login_date,
                    register_date,
                    DATEDIFF(login_date, register_date) date_diff -- 登陆日期和注册日期的差
    FROM (SELECT user_id,
                 DATE(login_date) login_date,
                 MIN(DATE(login_date)) OVER (PARTITION BY user_id) AS register_date -- 最小登陆日期即为注册日期
          FROM user_info) t1
)
SELECT register_date,
       COUNT(DISTINCT user_id) AS DAU,
       COUNT(CASE WHEN date_diff = 1 THEN a.user_id ELSE NULL END) AS "次日留存数",
       COUNT(CASE WHEN 1 < date_diff and date_diff <= 3 THEN a.user_id ELSE NULL END) AS "第3日留存数",
       COUNT(CASE WHEN 3 < date_diff and date_diff <= 7 THEN a.user_id ELSE NULL END) AS "第7日留存数",
       ROUND(COUNT(CASE WHEN date_diff = 1 THEN a.user_id ELSE NULL END) / COUNT(DISTINCT user_id), 2) "次日留存率",
       ROUND(COUNT(CASE WHEN 1 < date_diff and date_diff <= 3 THEN a.user_id ELSE NULL END) / COUNT(DISTINCT user_id), 2) "第3日留存率",
       ROUND(COUNT(CASE WHEN 3 < date_diff and date_diff <= 7 THEN a.user_id ELSE NULL END) / COUNT(DISTINCT user_id), 2) "第7日留存率"
FROM a
GROUP BY register_date
  • 效果
    在这里插入图片描述

案例3

参考牛客sql164

  • 公式

次日留存率=某日的新注册用户在第2日访问过APP的留存用户数 / 某日注册用户总数
和案例一 一样


案例4

参考牛客sql262

  • 公式

次日留存率=某日的新注册用户在第2日访问过APP的留存用户数 / 总新注册用户总数

  • 数据
drop table if exists login;
CREATE TABLE `login` (
`id` int(4) NOT NULL,
`user_id` int(4) NOT NULL,
`client_id` int(4) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO login VALUES
(1,2,1,'2020-10-12'),
(2,3,2,'2020-10-12'),
(3,1,2,'2020-10-12'),
(4,2,2,'2020-10-13'),
(5,4,1,'2020-10-13'),
(6,1,2,'2020-10-13'),
(7,1,2,'2020-10-14');
  • 代码
WITH t1 as
(
     SELECT user_id,   -- 防止用户一天内多次登陆的情况
            date,first_date,datediff(date,first_date) as date_diff
     from(
         SELECT user_id,date,min(date) over(PARTITION BY user_id) as first_date
         FROM login)t1
)SELECT
        COUNT(DISTINCT user_id) as uv,
        round(COUNT(CASE WHEN date_diff = 1 THEN t1.user_id ELSE NULL END) / COUNT(DISTINCT user_id),3) as "次日留存率"
FROM t1;
  • 效果
    在这里插入图片描述

参考

如何就留存率指标进行分析

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值