首页 > 其他分享 >Hive 刷题——员工在职人数问题

Hive 刷题——员工在职人数问题

时间:2023-02-16 12:45:03浏览次数:39  
标签:01 Hive flag 2020 emp 在职 dt select 刷题

需求描述

现有用户表(emp)如下。

id
(员工id)
en_dt
(入职日期)
le_dt
(离职日期)
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

解题思路

这个题目和之前同时在线人数有一部分是相通的,可以参考那个需求先求出每天的在职人数 

select c.dt, sum(nvl(flag, 0)) over (order by c.dt) emp_cnt
from cal c
         left join
     (select dt, sum(flag) flag
      from (select en_dt dt, 1 flag
            from emp
            union all
            select nvl(date_add(le_dt, 1), '2020-04-01') dt, -1
            from emp) t
      group by dt) u;

在后就是按照月份进行聚合求出在职人数和总天数就行了

参考SQL

select mnt, cast(sum(emp_cnt) / max(cnt) as decimal(10, 2)) ps
from (select month(dt) mnt, emp_cnt, sum(1) over (partition by month(dt)) cnt
      from (select c.dt, sum(nvl(flag, 0)) over (order by c.dt) emp_cnt
            from cal c
                     left join
                 (select dt, sum(flag) flag
                  from (select en_dt dt, 1 flag
                        from emp
                        union all
                        select nvl(date_add(le_dt, 1), '2020-04-01') dt, -1
                        from emp) t
                  group by dt) t1 on c.dt = t1.dt) t) t
group by mnt;

标签:01,Hive,flag,2020,emp,在职,dt,select,刷题
From: https://www.cnblogs.com/wdh01/p/17113267.html

相关文章

  • hadoop+hive+mysql+sqoop+spark完全分布式集群搭建
    hadoop+hive+mysql+sqoop+spark完全分布式集群搭建零、配置网络(固定ip)(可以不做,但是后面关闭后ip会重复变动,后面步骤中有再次提到,后面操作在做)1.固定ip因centos 7 ip......
  • 【牛客刷题】HJ68 成绩排序
    题目链接这题本身就是一个排序题,按照学生成绩排序,成绩一样的按照输入的前后顺序排。如果用Java,那么利用ArrayList能很轻松的完成:importjava.util.ArrayList;importja......
  • 数据结构刷题2023.02.15小记
    各排序算法时间复杂度如何提高哈希表的查找效率Hash表的查找效率取决于散列函数、处理冲突的方法和装填因子。显然,冲突的产生概率与装填因子(表中记录数与表长之比)的大小......
  • 报错:tar: This does not look like a tar archive
    一、现象解压时报错: 二、解决办法gzip-dxxxx.tar.gz(对于.tar.gz文件的处理方式)tar-xfxxxx.tar(对于.tar文件处理方式) 三、查看 ......
  • 【牛客刷题】HJ15 求int型正整数在内存中存储时1的个数
    题目链接题倒是很简单,最开始用了这么一种解法:packagemainimport"fmt"funcmain(){ a:=0 fmt.Scan(&a) str:=fmt.Sprintf("%b",a) fmt.Printf("%d",co......
  • Hive 面试题——HiveSQL 执行顺序
    描述今天刷到了一个面试题:hivesql执行顺序,接下来就从一个带有groupby的例子看看hivesql的执行顺序执行顺序为from..on..join..where..groupby..having......
  • 算法刷题-二叉树的锯齿形层序遍历、用栈实现队列_栈设计、买卖股票的最佳时机 IV
    二叉树的锯齿形层序遍历(树、广度优先搜索)给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二......
  • C++奥赛一本通刷题高精度题解
    title:C++奥赛一本通刷题记录(高精度)date:2017-11-15tags:一本通openjudegecategories:OIC++奥赛一本通刷题记录(高精度)2017.11.15Bygwj1139177410大整数加法​......
  • 【牛客刷题】HJ13 句子逆序
    题目链接题目本身不难,但是牛客的输入样例很坑,因此只好使用bufio来进行输入了:packagemainimport( "bufio" "fmt" "os" "strings")funcmain(){ input:=bu......
  • 【牛客刷题】HJ10 字符个数统计
    题目链接简单的说这题就是字符串去重以后检查长度。如果用Java的话,可以遍历字符串,然后利用Set来进行去重,最后统计Set的size就可以了。但是如果是Go语言,则稍微麻烦点。基......