项目背景
因最近疫情的关系,APP的数据回升慢,领导们打算做一次用户召回的计划,提高APP打开的率,需要从hive中获取出一批用户进行定向召回
需求范围
2月份有打开APP,但是3月份没有打开的用户
需求分析
拿到这个需求的时候,分析了一下,这莫不是反向取非留存用户的意思么?
我们来重温一下留存用户的定义:在互联网行业中,用户在某段时间内开始使用应用,经过一段时间后,仍然继续使用该应用的用户,被认作是留存用户。
那么这道题的需求就是:在某段时间内使用了APP,但是经过一段时间后,没有使用该APP的用户是哪些?
SQL代码部分
假设我们用一个用户活跃表,字段如下:
字段 | 字段解释 |
---|---|
uid | 用户唯一识别码 |
dt | 数据日期 |
我们重温一下留存用户数怎么算:
SELECT t1.dt,
COUNT(DISTINCT t1.uid)
FROM (SELECT uid from user_active_table where dt = '20200307') t1
LEFT JOIN (SELECT uid from user_active_table where dt = '20200308') t2
ON t1.uid = t2.uid
WHERE t2.uid is not null
GROUP BY t1.dt
通过子查询7号的活跃用户,左关联8号活跃的用户,当8号的uid字段不是null的时候,就代表这个用户在7号活跃过,这就是用左关联法求出的用户留存数
那么我们需要知道,具体哪些用户在2月活跃了,但是3月又没有活跃,可以通过SQL来实现:
SELECT t1.uid
FROM (SELECT uid from user_active_table where dt between '20200201' and '20200229') t1
LEFT JOIN (SELECT uid from user_active_table where dt between '20200301' and '20200308') t2
ON t1.uid = t2.uid
WHERE t2.uid is null
GROUP BY t1.uid
去重建议使用group by而不是distinct,这是一个底层的问题,自行度娘= =
通过左关联,限定uid为t2.uid字段为null的t1.uid即为我们的目标用户