目录

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--如何分析去掉最大最小值的平均薪水(字节跳动)相关推荐

  1. 浙江高校计算机等级考试二级办公,浙江省高校计算机等级考试二级(高级办公)试题12.ppt...

    <浙江省高校计算机等级考试二级(高级办公)试题12.ppt>由会员分享,可在线阅读,更多相关<浙江省高校计算机等级考试二级(高级办公)试题12.ppt(11页珍藏版)>请在人人 ...

  2. 2010年上半年5月份系统分析师上午试题答案(分析与解答)之四(第3次修订 修订时间:2010年6月1日14:41)

    2010年上半年5月份系统分析师上午试题答案(分析与解答)之四 (30) 参考答案:A (31) 参考答案:C (32) 参考答案:B (33) <<系统分析师考试全程指导>> ...

  3. python文本聚类 词云图_数据思维实践 | TASK 12 文本分析

    原标题:数据思维实践 | TASK 12 文本分析 文本分析可以干什么 生活中文本无处不在,网页上的新闻.证券分析师的研究报告.政府工作报告等等,这些都是文本.如何从文本中挖掘价值是文本分析需要回答的 ...

  4. java biginteger位数,Java之BigInteger(面试题12:打印1到最大的n位数)

    1.  以<剑指offer 名企面试官精讲典型编程题> - 面试题12:打印1到最大的n位数为例. 题目内容如下: 输入数字n,按顺序打印出从1到最大的n位十进制数. 比如输入3,则打印出 ...

  5. (补充)【打印1到最大的n位数】剑指offer——面试题12:打印1到最大的n位数

    剑指offer--面试题12:打印1到最大的n位数 此题在牛客网上没有OnlineJudge,在此补充两种做法. 参考网址:https://blog.csdn.net/yanxiaolx/articl ...

  6. 2010年上半年5月份系统分析师上午试题答案(分析与解答)之十

    2010年上半年5月份系统分析师上午试题答案(分析与解答)之十 (59) 参考答案: (60) 参考答案:D (61) 参考答案:C (62) 参考答案:B (63) 试题分析: 蓝光(Blu-ray ...

  7. 2021年最新总结,腾讯、阿里、美团、百度、字节跳动、京东等技术面试题,以及答案,专家出题人分析汇总。持续更新中。

    阿里篇 华为篇 百度篇 腾讯篇 美团篇 字节跳动篇 滴滴篇 京东篇 MySQL篇 Redis篇 MongoDB篇 Zookeeper篇 Nginx篇 算法篇 内存篇 cpu篇 磁盘篇 网络通信篇 安全 ...

  8. 一道亚马逊算法面试题的情景分析

    阅读博客的朋友可以观看视频: http://study.163.com/course/courseMain.htm?courseId=1002942008 我们聚焦于一道亚马逊的算法面试题,通过分析该 ...

  9. 计算机二级试题第12套,计算机等级考试二级VFP机试试题12

    第十二套 一.基本操作题(共四小题,第1和2题是7分.第3和4题是8分) 1.打开数据库PROD_M及数据库设计器,其中的两个表的必要的索引已经建立, 为这两个表建立永久性联系 2.设置CATEGOR ...

最新文章

  1. c语言程序改错类型,C语言程序改错总结
  2. 手挽手带你学React:三档 React-router4.x的使用
  3. 跳槽必看:产品经理面试试题汇总
  4. zipfile不能解压分卷压缩的文件
  5. C++STL常用排序算法
  6. aws 删除ec2实例_如何在AWS中启动EC2实例
  7. 底层基础软件崛起,达梦数据库的选择与收获
  8. 欧易OKEx交易大数据:BTC合约多空持仓人数比0.98,合约持仓总量为24.90亿美元
  9. 显示器点距 测试软件,大既是正义!最佳文本显示点距~AOC LV323HQPX显示器开箱
  10. 【目标检测】雷达目标CFAR检测算法
  11. idea繁体字-中文输入法变繁体字
  12. Premiere常用快捷键+网站推荐
  13. 资本纷纷入局,咖啡赛道还能香多久?
  14. EMQ X 工业物联网解决方案
  15. 刘天佐加盟《经济适用男》 变身木讷IT精英_0
  16. 使用文本排版大师(TxtEdit/TEditer)在记事本文件中绘制表格。
  17. IntelliJ IDEA 2021.1 关闭更新提醒
  18. 圆周率100位可以这样速记
  19. 华科提出首个用于伪装实例分割的一阶段框架OSFormer
  20. 【量产工具修复】U盘插上没反应,格式化提示有写保护

热门文章

  1. OSChina 周五乱弹 ——是的,我的老婆是抱枕
  2. “软苹果”不是孬种,只是做回了自己
  3. 雷军归来:在变化来临前创造变化
  4. Coravel是.NetCore中开源的工具库,可以让你使用定时任务,缓存,队列,事件,广播等高级应用程序变得轻而易举!...
  5. JEECG JDictSelectTag 表字典类型级联
  6. win10没有修改host权限的解决方案
  7. 微信小程序如何制作消息提示框---wx.showToast(Object object)
  8. java table设置行高_java – 如何全局更改JTable行高?
  9. 真实地形处理——高程图导入UE4进行操作
  10. 网站页面性能优化的34条守则