Hive最大连续登陆天数

博客介绍了如何在Hive中解决用户最大连续登陆天数的统计问题。通过分析登陆埋点数据,对用户ID进行分区并按日期递减排序,利用rank函数结合日期创建连续性标志,最后聚合获取每个用户的最长连续登陆天数。

用户最大连续登陆天数

问题是用户登陆埋点,会记录用户的id和记录的日期,原始数据如下:

idds
A2019-01-01
B2019-01-02
A2019-01-02
A2019-01-04
B2019-01-03
B2019-01-04
B2019-01-05

期望中的结果是统计用户A,和用户B分别最多连续登陆多少天:

iddays
A2
B4

问题的难点是,数据按天储存,并不知道同一id相邻两次登陆是否是连续,虽然可以查看相邻date相减看是否为1,但是要求最大连续天数,count也比较难操作。
我的思路是:先按id分区,按照ds递减排序,给予rank,并将rank与ds相加,理论上rank是隔1递增的,如果日期连续,则日期是隔1递减,因此连续日期的ds+rank应该相同:

iddsrankrank+ds
A2019-01-0412019-01-05
A2019-01-0222019-01-04
A2019-01-0132019-01-04
B2019-01-0512019-01-06
B2019-01-0422019-01-06
B2019-01-0332019-01-06
B2019-01-0242019-01-06

再根据rank+ds聚合,则可以统计对于一个用户而言,其每段连续登陆操作的天数,然后取每个用户的最大登陆天数即可:

idrank+dscount
A2019-01-051
A2019-01-042
B2019-01-064

代码如下:

SELECT id, MAX(num_days) AS max_continue
  FROM (
    SELECT id, tmp_index, COUNT(1) AS num_days
      FROM (
        SELECT id, ds
               ,DATE_ADD(ds, row_number() OVER (PARTITION by boss_id ORDER BY ds DESC)) AS tmp_index
          FROM da_tmp.boss_filter_xnc
         ) a
     GROUP BY id, tmp_index
     ) a
 GROUP BY id;

问题汇总

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值