Hive SQL面试题-流失回流用户数统计

流失回流用户数统计


根据用户最后一次登录记录表,统计每天的流失(一段时间未登录平台)用户数量,和回流用户(一段时间未登录平台,但今天重新登录了平台)数量。
执行环境:Hive on Spark

1 统计指标

从用户最后一次登录记录表中统计如下指标,当日流失用户数量当日回流用户数量

统计周期指标说明
最近1日流失用户数之前活跃过的用户,最近一段时间未活跃,就称为流失用户。
此处要求统计7日前(只包含7日前当天)活跃,但最近7日未活跃的用户总数。
最近1日回流用户数之前的活跃用户,一段时间未活跃(流失),今日又活跃了,就称为回流用户。
此处要求统计回流用户总数。

2 测试数据

  • 建表
-- user_id: 用户 id
-- last_login_date: 用户上次登录日期
-- dt: 日期分区
create table user_login_log (
    user_id string,
    last_login_date string,
    dt string
);
  • 插入数据
-- 1001 每天登录,普通用户
-- 1002 回流用户,一段时间未登录,然后 2020-06-14 又活跃了
-- 1003 流失用户,从 2020-06-07 之后就没有登录过了
insert into user_login_log values 
('1001', '2020-06-13', '2020-06-13'),
('1001', '2020-06-14', '2020-06-14'),
('1002', '2020-06-01', '2020-06-13'),
('1002', '2020-06-14', '2020-06-14'),
('1003', '2020-06-07', '2020-06-13'),
('1003', '2020-06-07', '2020-06-14');
  • 数据样例
select * from user_login_log;
user_idlast_login_datedt
10012020-06-132020-06-13
10022020-06-012020-06-13
10032020-06-072020-06-13
10012020-06-142020-06-14
10022020-06-142020-06-14
10032020-06-072020-06-14

3 实现思路

3.1 流失用户

统计当天(2020-06-14)的流失用户,此类用户特征是上次登录日期距当天日期已经达到 7 天

select '2020-06-14' as dt,
    count(*) as user_lost_count
from user_login_log where dt = '2020-06-14'
    and last_login_date = date_sub('2020-06-14', 7);
3.2 回流用户

统计当天(2020-06-14)的回流用户,此类用户的特征为当天(2020-06-14)登陆了平台,同时昨天的还属于流失用户,即前一天(2020-06-13)的最后登录日期在7天之前

  • 取出 2020-06-14 登录的用户
select user_id from user_login_log 
where dt = '2020-06-14' 
and last_login_date = '2020-06-14';
  • 取出 2020-06-13 还属于流失用户的用户
-- 此处 last_login_date <= date_sub('2020-06-14', 8) 
-- 表示前一天 date_sub('2020-06-14', 1) 处在流失状态的用户
select user_id from user_login_log
where dt = date_sub('2020-06-14', 1) 
and last_login_date <= date_sub('2020-06-14', 8);
  • 将两份数据 join 起来获得流失用户数
with t1 as (
    select user_id from user_login_log 
    where dt = '2020-06-14' 
    and last_login_date = '2020-06-14'
),t2 as (
    select user_id from user_login_log
    where dt = date_sub('2020-06-14', 1) 
    and last_login_date <= date_sub('2020-06-14', 8)
) select '2020-06-14',count(distinct t1.user_id) 
from t1 inner join t2 on t1.user_id = t2.user_id;
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值