hive,登录日志,计算每个人连续登录的最大天数

(腾讯)登录日志,计算每个人连续登录的最大天数!注意:断一天还算连续

尚学堂 讲解视频

id      dt
1001	2021-08-01
1001	2021-08-02
1001	2021-08-03
1001	2021-08-05
1001	2021-08-06
1001	2021-08-07
1001	2021-08-10
1001	2021-08-12
1002	2021-08-01
1002	2021-08-02
1002	2021-08-03
1002	2021-08-07
1002	2021-08-09
1002	2021-08-11
1002	2021-08-13
1002	2021-08-15

思路一:等差数列

1.1 开窗,按照id分组,同时按照dt排序,求Rank

select 
  id,
  dt,
  rank() over(partition by id order by dt) rk 
from tx;

1.2 将每行日期减去rk值,如果之前是连续的日期,则相减之后为相同日期

select
  id,dt,
  date_sub(dt,rk) flag
from t1;t2

1.3 计算绝对连续的天数

select
	id,
	flag,
	count(*) days
from t2
group by id,flag;

1.4 再计算连续问题

select
	id ,
	flag ,
	days,
	rank() over(partition by id order by flag) newFlag
from t3;

hive,登录日志,计算每个人连续登录的最大天数_第1张图片

1.5 将flag减去newFlag

select
	id,
	days,
	date_sub(flag, newFlag) flag
from t4;

hive,登录日志,计算每个人连续登录的最大天数_第2张图片

1.6 计算每个用户连续登录的天数,断一天也算

select
	id,
	flag,
	sum( days)+count(*)-1 days
from t5
group by id,flag; t6

1.7 计算最大连续天数

select
	id,
	max( days)
from t6

思路二:lag

2.1 将上一行数据下移

select
	id,
	dt,
	lag(1,dt, '1970-01-01 ') over(partition by id order by dt) lagDt
from tx;t1

2.2 将当前行日期减去下移的日期

select
	id,
	dt,
	datediff(dt,lagDt) dtDiff
from t1;t2

2.3 分组

select
	id,
	dt,
	sum(if(dtDiff>2,1,0)) over(partition by id order by dt) flag
from t2;t3

hive,登录日志,计算每个人连续登录的最大天数_第3张图片

2.4

select
	id,
	flag,
	datediff(max(dt) ,min(dt)) +1
from t3
group by id,flag;

你可能感兴趣的:(项目经验,hive,hadoop,数据仓库)