前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hive sql(六)—— 每个用户连续登录最大天数

hive sql(六)—— 每个用户连续登录最大天数

作者头像
大数据最后一公里
发布2021-08-05 10:16:24
2.6K0
发布2021-08-05 10:16:24
举报

需求

代码语言:javascript
复制
每个用户连续登录最大天数

建表语句

代码语言:javascript
复制
create table login(
    id string,
    rq string
)
row format delimited fields terminated by '\t'
;

数据

代码语言:javascript
复制
#这里将数据分开,便于直观看到连续登录天数
insert into table login values
(1,"2019-07-26"),
(1,"2019-07-27"),

(1,"2019-07-30"),
(1,"2019-07-31"),
(1,"2019-08-01"),

(2,"2019-07-26"),
(2,"2019-07-27"),
(2,"2019-07-28"),

(2,"2019-07-30"),
(2,"2019-07-31");

实现

代码语言:javascript
复制
select
    t3.id,
    max(t3.num)
from
    (select
        t2.id,
        count(*) as num
    from
        (select
            t1.id,
            date_sub(t1.rq,t1.n) as rq1
        from
            (select 
                id,
                rq,
                row_number() over(partition by id order by rq) as n
            from
                login
            group by id,rq -- 第一次分组
            )t1
        )t2
    group by t2.id,t2.rq1 -- 第二次分组
    )t3
group by t3.id -- 第三次分组
;

结果

代码语言:javascript
复制
Total MapReduce CPU Time Spent: 7 seconds 320 msec
OK
t3.id  _c1
1  3
2  3
Time taken: 38.097 seconds, Fetched: 2 row(s)

分析

代码语言:javascript
复制
1、通过对需求理解发现,首先需要对用户id开窗
2、连续登录,所以时间信息,并按照升序,需要在窗口里面添加order by
3、核心逻辑——连续登录的判断是,通过排序添加序号,再用当前日期和当前序号做差,
如果得到日期相同,则表示是连续日期,所以使用row_number,
4、整体的逻辑顺序是先排序添加序号字段、计算差值日期、统计差值日期相同数量、最后得出每个用户差值日期数最多即需求

扩展

代码语言:javascript
复制
1、这里t1,t2可以合并为一步,减少一次子查询
2、第一次分组是每个用户每天只有一条数据,第二次分组是统计差值日期相同数量,第三次分组是统计每个用户最大连续登录天数

知识点

代码语言:javascript
复制
1、row_number添加序号,无论字段值是否相同
2、date_sub(日期,数值),用日期-数值,即当前日期的前n天,返回值是日期字符串类型

分析中第3点在hive sql系列(三)中计算连续日活中也用到了日期差值,参考链接:

hive sql(三)—— 求所有用户和活跃用户的总数及平均年龄

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据最后一公里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档