Hive sql 每天场景题50
Posted 吃再多糖也不长胖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive sql 每天场景题50相关的知识,希望对你有一定的参考价值。
目前hive场景题就此结束,因为前面有时候做题会百度一下方法之类的,有些题不太熟练,所以后面从1重新再做一次,就不写笔记,也不发csdn了。
50、现有用户表(emp)如下。
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 | ps |
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的主要内容,如果未能解决你的问题,请参考以下文章