Hive最大连续登陆天数

用户最大连续登陆天数

问题是用户登陆埋点,会记录用户的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;

问题汇总


版权声明:本文为nightwish2018原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。