Hive经典面试题(三)——间隔连续问题

间隔连续问题

题目

在这里插入图片描述

数据

1001	2021-12-12
1002	2021-12-12
1001	2021-12-13
1001	2021-12-14
1001	2021-12-16
1002	2021-12-16
1001	2021-12-19
1002	2021-12-17
1001	2021-12-20

建表

create table if not exists intervalcontinuous(
id int,
dt date 
)row format delimited fields terminated by '\t';

加载数据

load data local inpath '/opt/module/data/hive-interviews/interval-continuous' into table intervalcontinuous;

解题步骤

步骤1 将上一行数据下移

sql语句

select 
id,dt,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagdt
from intervalcontinuous

结果

id	dt	lagdt
1001	2021-12-12	1970-01-01
1001	2021-12-13	2021-12-12
1001	2021-12-14	2021-12-13
1001	2021-12-16	2021-12-14
1001	2021-12-19	2021-12-16
1001	2021-12-20	2021-12-19
1002	2021-12-12	1970-01-01
1002	2021-12-16	2021-12-12
1002	2021-12-17	2021-12-16

步骤2 将时间上相邻的两行数据相减求出间隔的天数

sql语句

select id,dt,datediff(dt,lagdt) intervaldays
from(
select 
id,dt,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagdt
from intervalcontinuous
)t1

结果

id	dt	intervaldays
1001	2021-12-12	18973
1001	2021-12-13	1
1001	2021-12-14	1
1001	2021-12-16	2
1001	2021-12-19	3
1001	2021-12-20	1
1002	2021-12-12	18973
1002	2021-12-16	4
1002	2021-12-17	1

步骤3 开窗求第一行到当前行大于等于2的个数sumif

sql语句

select
id,dt,sum(if(intervaldays>=2,1,0)) over(partition by id order by dt) groupid
from(
select id,dt,datediff(dt,lagdt) intervaldays
from(
select 
id,dt,lag(dt,1,'1970-01-01') over(partition by id order by dt) lagdt
from intervalcontinuous
)t1
)t2

结果

id	dt	groupid
1001	2021-12-12	1
1001	2021-12-13	1
1001	2021-12-14	1
1001	2021-12-16	2
1001	2021-12-19	3
1001	2021-12-20	3
1002	2021-12-12	1
1002	2021-12-16	2
1002	2021-12-17	2

步骤4 按照id和groupid排序,求组内count

select id,count(groupid) days
from(
select
id,dt,sum(if(intervaldays>2,1,0)) over(partition by id order by dt) groupid
from(
select id,dt,datediff(dt,lagdt) intervaldays
from(
select
id,dt,lag(dt,1,‘1970-01-01’) over(partition by id order by dt) lagdt
from intervalcontinuous
)t1
)t2
)t3
group by id,groupid

id days
1001 4
1001 2
1002 1
1002 2

步骤5 求最大连续登陆日期数据

select t4.id,max(t4.days)
from(
select id,count(groupid) days
from(
select
id,dt,sum(if(intervaldays>2,1,0)) over(partition by id order by dt) groupid
from(
select id,dt,datediff(dt,lagdt) intervaldays
from(
select
id,dt,lag(dt,1,‘1970-01-01’) over(partition by id order by dt) lagdt
from intervalcontinuous
)t1
)t2
)t3
group by id,groupid

)t4
group by id;

t4.id _c1
1001 4
1002 2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongfeicao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值