@[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