hive之连续登录问题(2)

文章介绍了两种SQL方法来计算登陆日志中每个人连续登陆的最大天数。方法1利用等差数列原理,通过多次分组和计算得到结果,但修改条件较繁琐。方法2使用lag开窗函数,更简洁地处理了连续登陆天数的计算,能灵活适应不同连续天数的定义。
摘要由CSDN通过智能技术生成

问题

登陆日志,计算每个人连续登陆的最大天数!(注意:断一天也算连续)
数据如下所示:
id dt
01 2021-02-28
01 2021-03-01
01 2021-03-02
01 2021-03-04
01 2021-03-05
01 2021-03-06
01 2021-03-08
02 2021-03-01
02 2021-03-02
02 2021-03-03
02 2021-03-06
03 2021-03-06

方法1

思路:等差数列

1、按照id分组同时按照dt排序,求rk
2、将每行日期减去rk值得到flag标志,如果之前是连续的日期,则相减后为相同的日期,flag相同
3、按照id和flag分组,计算count(*)得数连续的天数
4、按照id分组同时按照flag排序,求rk
5、将每行flag减去rk值得到new_flag标志
6、按照id和new_flag分组,计算连续的天数
7、对id进行分组

sql 实现:

select 
	id
	,max(days) as days
from 
(select 
	id 
	,new_flag
	,sum(days)+count(*)-max(1)  as days
from 
(
select 
	id
	,flag
	,days 
	,falg -rank as new_falg
from 
(select
id
,flag
,days  
,rank() over(partition by id order by flag) as rank 
from 
(select 
	id
	,flag
	,count(dt) as days 
from (
select 
	id 
	,dt
	,dt -rk as flag 
from (
select 
	id
	,dt 
	rank()over(partition by id order by dt) rk
from tablename;
)t1 
)t2 
group by 
	id
	,flag
)t3
)t4
)t5
group by 
	id 
	,new_flag
	)t6
group by 
	id;

备注:这种方法有个弊端,像俄罗斯套娃,当条件发生改变,比如断5天也算连续,你要重复5次;

方法2

思路:采用lag开窗函数

sql 实现:

select 
	id
	,flag
	,datediff(max(dt),min(dt))+1
	from 
	(
	select 
	id
	,dt
	sum(if(dtDiff >2,1,0)) over (partition by id order by dt) as flag 
	from (
	select 
	id
	,dt
	,datediff(dt,lagDt) as dtDiff
	from (
	select 
	id
	,dt 
	,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagDt
	from tablename
	)t1
	)t2
	)t3
	group by 
	id
	,flag

备注:断一天也算连续,则 sum(if(dtDiff >2,1,0))处为2
断n天也算连续, 则 sum(if(dtDiff >n+1,1,0))处为n+1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值