Hive sql 每天场景题21-22
Posted 吃再多糖也不长胖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive sql 每天场景题21-22相关的知识,希望对你有一定的参考价值。
21、从登录明细表(user_login_detail)中查询每个用户两个登录日期(以login_ts为准)之间的最大的空档期。统计最大空档期时,用户最后一次登录至今的空档也要考虑在内,假设今天为2021-10-10
期望结果如下:
user_id | max_diff |
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 |
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的主要内容,如果未能解决你的问题,请参考以下文章