Hive sql 每天场景题50

Posted 吃再多糖也不长胖

tags:

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

目前hive场景题就此结束,因为前面有时候做题会百度一下方法之类的,有些题不太熟练,所以后面从1重新再做一次,就不写笔记,也不发csdn了。

50、现有用户表(emp)如下。

id
(员工id)

en_dt
(入职日期)

start_time
(离职日期)

1001

2020-01-02

null

1002

2020-01-02

2020-03-05

1003

2020-02-02

2020-02-15

1004

2020-02-12

2020-03-08

日历表(cal) 如下:

dt
(日期)

2020-01-01

2020-01-02

2020-01-03

2020-01-04

统计2020年每个月实际在职员工数量(只统计2020-03-31之前),如果1个月在职天数只有1天,数量计算方式:1/当月天数。

如果一个月只有一天的话,只算30分之1个人

期望结果如下:

mnt
<int>
(月份)

ps
<decimal(16,2)>
(在职人数)

1

1.94

2

3.62

3

2.23

代码

with t1 as (
select
-- 用日期表做主表
-- 关联emp表在职的天数,因为求的是每一天的在职人数,所以关联的时候,数--- 据发散的数据,每left join成功一次就代表一个人在职日期,因为只统计--- -- 2020-03-31之前,所以还没离职的员工的离职日期也设定为2020-03-31,这--- 样就能被cal日期关联
a.dt 
,nvl(b.id,0) as id
,nvl(b.en_dt,0) as en_dt
,nvl(b.le_dt,0) as le_dt
from cal a
left join (select id,en_dt,nvl(le_dt,'2020-03-31')as le_dt from emp)b 
on a.dt>=b.en_dt and a.dt <=b.le_dt
)
select 
mnt
,cast(work_days/days as decimal(10,2)) as ps
from(
--  按每月统计
select
month(dt) as mnt
,sum(if(id!=0,1,0)) as work_days
,count(distinct dt) as days
from t1
group by 
month(dt)
)a

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

Hive sql 每天场景题45

Hive sql 每天场景题21-22

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

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

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

sql面试题1