Hive sql 每天场景题21-22

Posted 吃再多糖也不长胖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive sql 每天场景题21-22相关的知识,希望对你有一定的参考价值。

21、从登录明细表(user_login_detail)中查询每个用户两个登录日期(以login_ts为准)之间的最大的空档期。统计最大空档期时,用户最后一次登录至今的空档也要考虑在内,假设今天为2021-10-10

期望结果如下:

user_id
<string>
(用户id)

max_diff
<bigint>
(最大空档期)

101

10

102

9

103

10

104

9

105

6

106

5

107

10

108

4

109

10

1010

12

需要用到的表:

用户登录明细表:user_login_detail

user_id(用户id)

ip_address(ip地址)

login_ts(登录时间)

logout_ts(登出时间)

101

180.149.130.161

2021-09-21 08:00:00

2021-09-27 08:30:00

102

120.245.11.2

2021-09-22 09:00:00

2021-09-27 09:30:00

103

27.184.97.3

2021-09-23 10:00:00

2021-09-27 10:30:00

代码

-- 用户 登录时间  下一次登录时间 最后一次登录时间 今天登录
with t as (
select 
user_id
,login_ts
,lead(login_ts) over(partition by user_id order by login_ts) as nex_login_ts
,max(login_ts) over(partition by user_id order by login_ts rows BETWEEN unbounded preceding and unbounded following )  last_login_ts
,'2021-10-10' as today_login_ts
from user_login_detail)
,t2 as (
-- 用户 登录时间 与下次登录时间的空档期 最后一次登录和今天的空档期
select 
user_id
,datediff(nex_login_ts,login_ts) as diff
from t
union all 
select 
distinct 
user_id 
,datediff(today_login_ts,last_login_ts) as diff
from t)

select 
user_id
,max(diff) as max_diff
from t2
group by user_id

22、从登录明细表(user_login_detail)中查询在相同时刻,多地登陆(ip_address不同)的用户

期望结果如下:

user_id
<string>
(用户id)

101

102

104

107

需要用到的表:

用户登录明细表:user_login_detail

user_id(用户id)

ip_address(ip地址)

login_ts(登录时间)

logout_ts(登出时间)

101

180.149.130.161

2021-09-21 08:00:00

2021-09-27 08:30:00

102

120.245.11.2

2021-09-22 09:00:00

2021-09-27 09:30:00

103

27.184.97.3

2021-09-23 10:00:00

2021-09-27 10:30:00

代码

with  t as (
-- 用户 地址 登陆时间 登出时间 该用户下一条登录地址,下一条登陆时间,下一条登出时间
select  
user_id
,ip_address
,login_ts
,logout_ts
,lead(ip_address,1,'null') over(partition by user_id order by login_ts ) as next_ip_address
,lead(login_ts,1,'null') over(partition by user_id order by login_ts ) as next_login_ts
,lead(logout_ts,1,'null') over(partition by user_id order by login_ts ) as next_logout_ts
from user_login_detail
)

-- 筛选数据 : 当前登录时间下一条数据的登录与登出时间之内,或者下一条数据的登录在当前行的登录与登出时间内 。同时地址不同
select 
user_id
from t
where ((login_ts >=next_login_ts and login_ts<= next_logout_ts ) or (next_login_ts >= login_ts and next_login_ts <= logout_ts)) and ip_address !=next_ip_address

以上是关于Hive sql 每天场景题21-22的主要内容,如果未能解决你的问题,请参考以下文章

Hive sql 每天场景题45

Hive sql 每天场景题 41

每天一道大厂SQL题Day02电商场景TopK统计

每天一道大厂SQL题Day02电商场景TopK统计

9大 HIVE SQL 最频繁被问到的面试题

面试题: Hive-SQL查询连续活跃登录用户思路详解