sql留存用户率练习题

概述

手机中的相机是深受大家喜爱的应用之一,现在该手机厂商想要分析手机中的应用(相机)的活跃情况,需统计如下数据:

某日活跃用户(用户id)在后续的一周内的留存情况(计算次日留存用户数,3日留存用户数,7日留存用户数)

指标定义

  • 某日活跃用户数,某日活跃的去重用户数。

  • N日活跃用户数,某日活跃的用户数在之后的第N日活跃用户数。

  • N日活跃留存率,N日留存用户数/某日活跃用户数

  • 例:登陆时间(20180501日)去重用户数10000,这批用户在20180503日仍有7000人活跃,则3日活跃留存率为7000/10000=70%

    数据集app_user_info:

在这里插入图片描述

字段名字段类型备注
uidstring用户唯一标识
app_namestring手机app名称,如“相机”,“微信”等
durationbigint启动时长(天)
timesbigint启动次数(天)
daynostring表分区字段,如2018-05-1

所获得的结果如下:

日期活跃用户数次日留存用户数三日留存用户数七日留存用户数次日留存率三日留存率七日留存率
20180501
20180502
20180503
20180508
20180509
20180510

要求:

1、活跃用户数为整数

2、留存率表示为百分比,保留2位小数

3、仅一条SQL(或者 hive SQL)完成。

4、仅需写出实现的查询代码即可。

思路

  • 首先搞清楚所需字段:日期(dayno)和用户数(uid)

  • 由于一天用户可以多次打开一个app,一天会形成多条记录,也就是一天用户ID会出现多次,并且这一天的日期字段会出现多次,所以对需要对uid,dayno进行分组,相当于去重处理

  • 只需筛选相机的数据,并且根据要求的结果呈现形式需要对日期进行格式化处理

解答

SELECT a.day1 AS '日期',COUNT(DISTINCT a.uid) AS '活跃用户数',
SUM(IF(b.day1-a.day1=1,1,0)) AS '次日留存用户数',
SUM(IF(b.day1-a.day1=2,1,0)) AS '三日留存用户数',
SUM(IF(b.day1-a.day1=6,1,0)) AS '七日留存用户数',
CONCAT(ROUND(SUM(IF(b.day1-a.day1=1,1,0))/COUNT(DISTINCT a.uid)*100,2),'%') AS '次日留存率',
CONCAT(ROUND(SUM(IF(b.day1-a.day1=2,1,0))/COUNT(DISTINCT a.uid)*100,2),'%') AS '次日留存率',
CONCAT(ROUND(SUM(IF(b.day1-a.day1=6,1,0))/COUNT(DISTINCT a.uid)*100,2),'%') AS '次日留存率'
FROM
(SELECT uid,DATE_FORMAT(dayno,'%Y%m%d') AS day1
FROM app_user_info WHERE app_name = '相机' GROUP BY uid,day1) a
LEFT JOIN 
(SELECT uid,DATE_FORMAT(dayno,'%Y%m%d') AS day1
FROM app_user_info WHERE app_name = '相机' GROUP BY uid,day1) b
ON a.uid = b.uid WHERE a.day1 <=b.day1 
GROUP BY a.day1
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值