HiveSql面试题12--如何分析去掉最大最小值的平均薪水(字节跳动)
目录
0 问题描述
1 数据准备
2 数据分析
3 小结
0 问题描述
- 薪水表中是员工薪水的基本信息,包括雇员编号,部门编号和薪水
- 第1行表示雇员编号为10001的员工在1号部门,薪水为60117元;
- 第2行表示雇员编号为10002的员工在2号部门,薪水为92102元;
- ...
- 第10行表示雇员编号为10010的员工在1号部门,薪水为76884元
问题:查询每个部门除去最高、最低薪水后的平均薪水,并保留整数。
1 数据准备
(1)数据
雇员编号 | 部门编号 | 薪水 |
10001 | 1 | 60117 |
10002 | 2 | 92102 |
10003 | 2 | 86074 |
10004 | 1 | 66596 |
10005 | 1 | 66961 |
10006 | 2 | 81046 |
10007 | 2 | 94333 |
10008 | 1 | 75286 |
10009 | 2 | 85994 |
10010 | 1 | 76884 |
(2)建表SQL
drop table if exists dan_test.salaryCREATE TABLE dan_test.salary (emp_num string ,dep_num string ,salary string)ROW format delimited FIELDS TERMINATED BY ",";
(3)加载数据
load data local inpath "/home/centos/dan_test/salary.txt" into table salary;
(4) 查询数据
2 数据分析
目标:需要查询每个部门除去最高、最低薪水后的平均薪水,并保留整数。
三个关键点信息:
- (1) 每个部门(按部门分组)
- (2)除去最高、最低薪水。(需要先求出最高,最低的薪水,并进行过滤,本题的关键)
- (3)在(1)和(2)基础上求平均值,并保留整数
思路1:找出部门中最高、最低薪水并进行过滤。采用窗口函数row_number()对按部门分组,薪水排序后的数据进行标记
SQL如下:
select emp_num,dep_num,salary,row_number() over(partition by dep_num order by salary) as rn1 --标记最小,row_number() over(partition by dep_num order by salary desc) rn2 --标记最大
from salary
查询结果如下:
根据需求,过滤出中间结果,即rn1 >1 和rn2 >1 条件同时成立。当存在多个窗口结果集,且显示的字段参与窗口运算,则该字段以最后一个窗口函数为准,如本题salary显示结果是以最后一个窗口结果显示的。 最终SQL如下
select *
from(
select emp_num,dep_num,salary,row_number() over(partition by dep_num order by salary) as rn1 --标记最小,row_number() over(partition by dep_num order by salary desc) rn2 --标记最大
from salary
) t
where rn1 > 1 and rn2 > 1
思路2:为了过滤最大、最小,我们可以只进行一次排序,先求出分组总行数,然后对salary进行分组升序排序,那么我们需要的结果就是,1<rn<cn。具体SQL如下:
select emp_num,dep_num,salary,count(1) over(partition by dep_num) as cn --求出总行数,row_number() over(partition by dep_num order by salary ) rn --按照薪水升序排序
from salary
最终过滤出需要的结果如下:
select *
from(
select emp_num,dep_num,salary,count(1) over(partition by dep_num) as cn --求出总行数,row_number() over(partition by dep_num order by salary ) rn --按照薪水升序排序
from salary
) t
where rn > 1 and rn < cn
求得最终平均值的SQL如下:
---方法1
select t.dep_num,round(avg(t.salary),0) as avg_salary
from(select *,row_number() over (partition by dep_num order by salary desc) as rn1,row_number() over (partition by dep_num order by salary) as rn2from salary) t
where t.rn1 > 1 and t.rn2 > 1
group by t.dep_num;--------方法2
select t.dep_num,round(avg(t.salary),0) as avg_salary
from(select emp_num,dep_num,salary,count(1) over(partition by dep_num) as cn --求出总行数,row_number() over(partition by dep_num order by salary ) rn --按照薪水升序排序from salary) t
where t.rn > 1 and t.rn < t.cn
group by t.dep_num;
计算结果如下:
方法3:公式法。按照求平均值的正常思路:(sum(salary)-max(salary) -min(salary)) / count(salary) -2 --按照部门分组。
(1)先按每个部门求最大薪水值、最小薪水值、薪水值总和总次数。具体SQL如下:
select dep_num,count(salary) as cn --求出总个数,max(salary) as max_salary --salary最大值,min(salary) as min_salary --salary最小值,sum(salary) as sum_salary --salary总和
from salary
group by dep_num
求的结果如下:
(2)求每个部门去除最大、最小值后的平均值 (公式法)。
此时按照部门进行分组后,由于未在分组中的字段的获取必须放在聚合函数中才能被使用,因而我们采用max()函数来获取其余字段,但会不会影响结果呢?其实是不会影响的,因为上一步的结果返回值都是聚合过后的,每个部门只有一条数据,每个字段也只有一个值,因而你无论使用了max(),min(),sum()等函数其结果都是一样的。这也是一种技巧,当分组后如果这一组中只有一个值时,为了提取该字段值,我们可以使用max(),min()函数进行提取,聚合函数往往也具有过滤NULL值的作用,利用这一特性,在写SQL时往往为上层查询提供了很多便利。
最终的SQL 如下:
select dep_num,(max(sum_salary) - max(max_salary) -max(min_salary)) / (max(cn) -2) as avg_salary--使用max()函数提取非group by组中的字段值,供上层计算
from (
select dep_num,count(salary) as cn --求出总个数,max(salary) as max_salary --salary最大值,min(salary) as min_salary --salary最小值,sum(salary) as sum_salary --salary总和
from salary
group by dep_num
) t
group by dep_num
最终结果如下:
3 小结
本文使用的知识点总结:
- (1)排名函数的作用及使用技巧。row_number()
- (2)round()函数的使用。
- (3)如何排除最大、最小值的技巧
- (4)非group by字段中值如何获取的技巧
HiveSql面试题12--如何分析去掉最大最小值的平均薪水(字节跳动)相关推荐
- 浙江高校计算机等级考试二级办公,浙江省高校计算机等级考试二级(高级办公)试题12.ppt...
<浙江省高校计算机等级考试二级(高级办公)试题12.ppt>由会员分享,可在线阅读,更多相关<浙江省高校计算机等级考试二级(高级办公)试题12.ppt(11页珍藏版)>请在人人 ...
- 2010年上半年5月份系统分析师上午试题答案(分析与解答)之四(第3次修订 修订时间:2010年6月1日14:41)
2010年上半年5月份系统分析师上午试题答案(分析与解答)之四 (30) 参考答案:A (31) 参考答案:C (32) 参考答案:B (33) <<系统分析师考试全程指导>> ...
- python文本聚类 词云图_数据思维实践 | TASK 12 文本分析
原标题:数据思维实践 | TASK 12 文本分析 文本分析可以干什么 生活中文本无处不在,网页上的新闻.证券分析师的研究报告.政府工作报告等等,这些都是文本.如何从文本中挖掘价值是文本分析需要回答的 ...
- java biginteger位数,Java之BigInteger(面试题12:打印1到最大的n位数)
1. 以<剑指offer 名企面试官精讲典型编程题> - 面试题12:打印1到最大的n位数为例. 题目内容如下: 输入数字n,按顺序打印出从1到最大的n位十进制数. 比如输入3,则打印出 ...
- (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数
剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...
- 2010年上半年5月份系统分析师上午试题答案(分析与解答)之十
2010年上半年5月份系统分析师上午试题答案(分析与解答)之十 (59) 参考答案: (60) 参考答案:D (61) 参考答案:C (62) 参考答案:B (63) 试题分析: 蓝光(Blu-ray ...
- 2021年最新总结,腾讯、阿里、美团、百度、字节跳动、京东等技术面试题,以及答案,专家出题人分析汇总。持续更新中。
阿里篇 华为篇 百度篇 腾讯篇 美团篇 字节跳动篇 滴滴篇 京东篇 MySQL篇 Redis篇 MongoDB篇 Zookeeper篇 Nginx篇 算法篇 内存篇 cpu篇 磁盘篇 网络通信篇 安全 ...
- 一道亚马逊算法面试题的情景分析
阅读博客的朋友可以观看视频: http://study.163.com/course/courseMain.htm?courseId=1002942008 我们聚焦于一道亚马逊的算法面试题,通过分析该 ...
- 计算机二级试题第12套,计算机等级考试二级VFP机试试题12
第十二套 一.基本操作题(共四小题,第1和2题是7分.第3和4题是8分) 1.打开数据库PROD_M及数据库设计器,其中的两个表的必要的索引已经建立, 为这两个表建立永久性联系 2.设置CATEGOR ...
最新文章
- c语言程序改错类型,C语言程序改错总结
- 手挽手带你学React:三档 React-router4.x的使用
- 跳槽必看:产品经理面试试题汇总
- zipfile不能解压分卷压缩的文件
- C++STL常用排序算法
- aws 删除ec2实例_如何在AWS中启动EC2实例
- 底层基础软件崛起,达梦数据库的选择与收获
- 欧易OKEx交易大数据:BTC合约多空持仓人数比0.98,合约持仓总量为24.90亿美元
- 显示器点距 测试软件,大既是正义!最佳文本显示点距~AOC LV323HQPX显示器开箱
- 【目标检测】雷达目标CFAR检测算法
- idea繁体字-中文输入法变繁体字
- Premiere常用快捷键+网站推荐
- 资本纷纷入局,咖啡赛道还能香多久?
- EMQ X 工业物联网解决方案
- 刘天佐加盟《经济适用男》 变身木讷IT精英_0
- 使用文本排版大师(TxtEdit/TEditer)在记事本文件中绘制表格。
- IntelliJ IDEA 2021.1 关闭更新提醒
- 圆周率100位可以这样速记
- 华科提出首个用于伪装实例分割的一阶段框架OSFormer
- 【量产工具修复】U盘插上没反应,格式化提示有写保护
热门文章
- OSChina 周五乱弹 ——是的,我的老婆是抱枕
- “软苹果”不是孬种,只是做回了自己
- 雷军归来:在变化来临前创造变化
- Coravel是.NetCore中开源的工具库,可以让你使用定时任务,缓存,队列,事件,广播等高级应用程序变得轻而易举!...
- JEECG JDictSelectTag 表字典类型级联
- win10没有修改host权限的解决方案
- 微信小程序如何制作消息提示框---wx.showToast(Object object)
- java table设置行高_java – 如何全局更改JTable行高?
- 真实地形处理——高程图导入UE4进行操作
- 网站页面性能优化的34条守则