经典SQL之留存率

3天留存率,7天留存率场景也是常考SQL题之一,今天来手撕留存率。

什么是留存率

n日留存率 = 第n天还在登录的用户数/新增的用户数

如:假如某日新增了100个用户,第2天登录了50个,则第2天留存率为50/100=50%,第3天登录了30个,则第3天留存率为30/100=30%,以此类推,第7天登录了10个用户,则7日留存率就是10/100=10%。

drop table if exists tmp_db.user_login_details;
create table tmp_db.user_login_details 
(Userid int  -- 用户ID
 ,Login_time timestamp  -- 登录时间
)

测试数据

-- 搞点测试数据
insert overwrite table tmp_db.user_login_details
select 1010123,'2021-08-02 11:05:02'
union all 
select 1010123,'2021-08-03 12:03:05'
union all 
select 1010123,'2021-08-04 11:05:02'
union all 
select 1010123,'2021-08-05 11:05:02'
union all 
select 1010123,'2021-08-05 18:05:02'
union all 
select 1010128,'2021-08-02 11:05:02'
union all 
select 1010444,'2021-08-02 11:05:02'
union all 
select 1010444,'2021-08-04 11:05:02'
union all 
select 1010444,'2021-08-05 11:05:02'
union all 
select 1010444,'2021-08-09 11:05:02'
union all 
select 1010199,'2021-08-02 11:05:02'
union all 
select 1010199,'2021-08-04 11:05:02'
union all 
select 1010199,'2021-08-05 11:05:02'
union all 
select 1010199,'2021-08-05 15:05:02'
union all
select 1010155,'2021-08-02 11:05:02'
union all 
select 1010155,'2021-08-04 11:05:02'
union all 
select 1010155,'2021-08-05 11:05:02'
union all 
select 1010155,'2021-08-07 11:05:02'
union all
select 1010166,'2021-08-02 11:05:02'
union all 
select 1010166,'2021-08-04 11:05:02'

处理数据,插入临时表

如果一个用户一天多次登录那么就会有重复,这里是为了去重,如果用户有登录,一天一个用户一条数据即可

drop table if exists tmp_db.user_login_details_01;
create table tmp_db.user_login_details_01 AS
SELECT Date(login_time) AS log_day, 
       Userid AS Userid 
  FROM  tmp_db.user_login_details 
 GROUP BY Userid,Date(login_time) 

计算

SELECT log_date,
       count( Userid_day0 ) AS user_cnt,   -- 新增用户数
       case when count(Userid_day0) = 0  
	        then 0 
			else  count( Userid_day1 ) / count(Userid_day0) 
			end as retention_ratio2 , -- 次日留存率
       case when count(Userid_day0) = 0  
	        then 0 
			else count(Userid_day2) / count(Userid_day0) 
			end as retention_ratio3  -- 3日留存率
  FROM
      (SELECT a.log_date,
              a.Userid AS Userid_day0,
              b.Userid AS Userid_day1,
              c.Userid AS Userid_day2 
         FROM tmp_db.user_login_details_01 a
         LEFT JOIN tmp_db.user_login_details_01 b 
		   ON a.Userid = b.Userid 
		  AND DATE_add(a.log_date,1) =b.log_date
         LEFT JOIN tmp_db.user_login_details_01 c 
		   ON a.Userid = c.Userid 
		  AND DATE_add(a.log_date,2) =c.log_date
      ) temp 
 GROUP BY log_date 

如何提高用户留存率

  • 营销活动刺激。营销活动能够刺激用户消费,而一个好的营销活动绝对能够大幅度提升用户的留存和复购率
  • 合理的消息推送,过于频繁的push会造成用户流失,但合理适时进行push推送能起到唤醒用户的作用,push推送,要做到精准化,前提是你需要了解你的用户,给用户进行标签管理。针对不用标签的用户进行不同内容的推送,提高用户体验。
  • 善用签到机制提高用户粘性,签到功能,对于提高用户粘性有很大的帮助。签到可获取积分,连续签到,积分叠加等形式。
  • 用内容留住用户,优质的内容是留住用户的关键。
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PG SQL是PostgreSQL数据库的简称,留存率是指用户在一段时间内仍然使用某个产品或服务的比例。PG SQL可以用来计算留存率,具体的代码实现如下: ``` -- 创建用户表 CREATE TABLE users ( user_id INTEGER, created_at TIMESTAMP, PRIMARY KEY (user_id) ); -- 创建活跃用户表 CREATE TABLE active_users ( user_id INTEGER, last_active TIMESTAMP, PRIMARY KEY (user_id) ); -- 计算留存率 WITH retention AS ( SELECT DATE_TRUNC('day', created_at) AS cohort_day, DATE_TRUNC('day', last_active) AS active_day, COUNT(DISTINCT users.user_id) AS cohort_size, COUNT(DISTINCT active_users.user_id) AS active_size FROM users JOIN active_users ON users.user_id = active_users.user_id WHERE created_at >= '2022-01-01' AND last_active >= '2022-01-01' GROUP BY 1, 2 ) SELECT cohort_day, active_day, cohort_size, active_size, ROUND(active_size::NUMERIC / cohort_size, 2) AS retention_rate FROM retention; ``` 以上代码中,首先创建了两个表:`users`表和`active_users`表。`users`表用于存储所有用户的信息,包括用户ID和创建时间;`active_users`表用于存储所有活跃用户的信息,包括用户ID和最后活跃时间。 接下来使用WITH语句计算留存率。首先按照创建日期和最后活跃日期对用户进行分组,统计每组中的用户数量和活跃用户数量。最后将结果按照日期和留存率进行输出。 如果你需要更加详细的介绍或者代码实现,请提供更加具体的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据_苡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值