HiveSQL面试题
一、各类型专利top 10申请人,以及对应的专利申请数
1)表名:t_patent_detail (专利明细表)
2)表字段:专利号(patent_id)、专利名称(patent_name)、专利类型(patent_type)、申请时间
(aplly_date)、授权时间(authorize_date)、申请人(apply_users)
3)说明:同一个专利,可以有1到多个申请人,多人之间按分号隔开。本表记录数约1万条。例
如:
4)请写出hive查询语句,各类型专利top 10申请人,以及对应的专利申请数
解题思路
-
爆炸函数炸开apply_users(注意不要忘记分隔符)
-
按照专利种类,申请人进行分组,得到每个种类中每个人申请了多少次
-
用排名函数进行倒序排序(这里用的dense_rank)
-
取top10
代码
create table t_patent_detail(
patent_id string,
patent_name string,
patent_type string,
apply_date date,
authorize_date date,
apply_users string
);
with t1 as (
select patent_type,apply_user from t_patent_detail lateral view explode(split(apply_users,';')) t1 as apply_user
), t2 as (
select patent_type,apply_user,count(*) cou from t1 group by patent_type,apply_user
),t3 as (
select *,dense_rank() over (partition by patent_type,apply_user order by cou desc) den from t2
)select * from t3 where den<=10;
二十、查询出用户连续三天登录的所有数据记
用户登录记录表
id dt
1 2024-04-25
1 2024-04-26
1 2024-04-27
1 2024-04-28
1 2024-04-30
1 2024-05-01
1 2024-05-02
1 2024-05-04
1 2024-05-05
2 2024-04-25
2 2024-04-28
2 2024-05-02
2 2024-05-03
2 2024-05-04
期望结果:
解题思路
-
利用log写出上一条和上上一条的信息,如果为空则返回该条的dt
-
利用datediff对日期进行相减,如果该条dt与上条上上条之差都为-1,即该用户连续登录了三天
代码
建表
create table user_log(
id int,
dt string
)row format delimited
fields terminated by ',';
drop table user_log;
导入数据
load data local inpath '/home/20.txt' into table user_log;
求解
with t1 as (
select *,nvl(lag(dt,1) over(),dt) dt2,nvl(lag(dt,2) over (),dt) dt3 from user_log
),t2 as (
select *,datediff(dt,dt2) df1,datediff(dt2,dt3) df2 from t1
)select id,dt from t2 where df1 = -1 and df2 = -1;