面试题 Hive-SQL查询连续活跃登录用户思路详解_sql查询连续登录两天的用户(1)

连续活跃登陆的用户指至少连续2天都活跃登录的用户

解决类似场景的问题

创造数据

CREATE TABLE test5active(
dt string,
user_id string,
age int)
ROW format delimited fields terminated BY ',';
 
INSERT INTO TABLE test5active VALUES
('2019-02-11','user\_1',23),('2019-02-12','user\_1',23),('2019-02-11','user\_2',19),
('2019-02-11','user\_3',39),('2019-02-11','user\_1',23),
('2019-02-11','user\_3',39),('2019-02-11','user\_1',23),
('2019-02-12','user\_2',19),('2019-02-13','user\_1',23),
('2019-02-15','user\_2',19),('2019-02-16','user\_2',19);

登录日志去重

因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重。

select distinct  user_id,dt from test5active

在这里插入图片描述

一、思路一

1、再用row_number() over(partition by _ order by _)函数将用户id分组,按照登陆时间进行排序。

2、计算登录日期减去第二步骤得到的结果值,用户连续登陆情况下,每次相减的结果都相同。

3、按照id和日期分组并求和,筛选大于等于2的即为连续活跃登陆的用户。

1.1、分组排序

SELECT
t1.user_id,
t1.dt,
ROW_NUMBER() OVER(PARTITION BY t1.user_id ORDER BY t1.dt) day_rank
FROM (
 SELECT DISTINCT dt,user_id FROM test5active
)t1;

在这里插入图片描述

1.2、日期减去计数值得到结果, 用户连续登陆情况下,每次相减的结果都相同

SELECT 
    t2.user_id,
    t2.dt,
    date_sub(t2.dt, t2.day_rank) AS dis
FROM ( 
	SELECT 
        t1.user_id,
        t1.dt,
        ROW_NUMBER() OVER(PARTITION BY t1.user_id ORDER BY  t1.dt) day_rank
    FROM 
        (SELECT DISTINCT dt, user_id FROM test5active) t1
)t2;

在这里插入图片描述

1.3、根据 user_id 和 dis 分组,得到用户的 开始、结束时间、连续登录天数

SELECT 
    t3.user_id,
    MIN(t3.dt),
    MAX(t3.dt),
    COUNT(1)
FROM 
    (SELECT 
        t2.user_id,
        t2.dt,
        DATE_SUB(t2.dt, t2.day_rank) AS dis
    FROM 
        (SELECT 
            t1.user_id,
            t1.dt,
            ROW_NUMBER() OVER(PARTITION BY t1.user_id ORDER BY  t1.dt) day_rank
        FROM 
            (SELECT DISTINCT dt, user_id FROM test5active) t1 
    ) t2 
) t3
GROUP BY  t3.user_id,t3.dis

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

需要这份系统化资料的朋友,可以戳这里获取

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值