Hive Sql 求每个用户连续登陆的最大天数

@[TOC]Hive Sql 求每个用户连续登陆的最大天数

uid,dt
1,2019-08-01
1,2019-08-02
1,2019-08-03
1,2019-08-04
1,2019-08-06
1,2019-08-07
2,2019-08-01
2,2019-08-02
3,2019-08-01
3,2019-08-03
4,2019-07-28
4,2019-07-29
4,2019-08-01
4,2019-08-02
4,2019-08-03
4,2019-08-04
4,2019-08-05
求每个用户连续登陆的最大天数?输出结果应该如下所示:
uid cnt_days
1 4
2 2
3 1
4 5

create table user_login(
uid int,
dt date
)
row format delimited
fields terminated by ‘,’;

load data local inpath ‘/root/data/user_login.txt’ overwrite into table user_login;

第一步:(最重要)
思想是,用每一行的日期减去按顺序(升序)排列的1,2,3,4,5…(这些数字用排名函数配合开窗函数生成),
连续的日期相减之后的值是一样的(因为日期也是按照升序排列的),否则会不一样,出现断层。这些一样的数量就是连续登陆的天数

select uid, date_sub(dt,row_number() over(partition by uid order by dt)) as dt1
from user_login

uid dt1
1 2019-07-31
1 2019-07-31
1 2019-07-31
1 2019-07-31
1 2019-08-01
1 2019-08-01
2 2019-07-31
2 2019-07-31
3 2019-07-31
3 2019-08-01
4 2019-07-27
4 2019-07-27
4 2019-07-29
4 2019-07-29
4 2019-07-29
4 2019-07-29
4 2019-07-29

第二步:
就是求和了,同时按uid和dt1进行分组,求出每个uid相同dt1的数量

select A.uid,A.dt1,count(A.dt1) num
from
(select uid, date_sub(dt,row_number() over(partition by uid order by dt)) as dt1
from user_login) A
group by A.uid,A.dt1

a.uid a.dt1 num
1 2019-07-31 4
1 2019-08-01 2
2 2019-07-31 2
3 2019-07-31 1
3 2019-08-01 1
4 2019-07-27 2
4 2019-07-29 5

第三步:
求最大值了,即连续登陆的最大天数

select B.uid uid,max(B.num) cnt_days
from
(select A.uid,A.dt1,count(A.dt1) num
from
(select uid, date_sub(dt,row_number() over(partition by uid order by dt)) as dt1
from user_login) A
group by A.uid,A.dt1) B
group by B.uid;

uid cnt_days
1 4
2 2
3 1
4 5

你可能感兴趣的:(hive)