点击上方公众号进入 3分钟秒懂大数据 主页
然后点击右上角 “设为标星”
比别人更快接收硬核文章
大家好,我是土哥。
今天分享一位读者面试字节时遇到的sql题,欢迎大家在评论区各抒己见、集思广益。
原题:【手撕sql】有一张工资表,字段分别是:员工工号、部门、工资。要求各部门除去最高工资和最低工资后的平均工资。
这位读者用了两个开窗(一个rank除去最低工资、一个max除去最高工资)做出来了,代码调试有问题,跑不出来。面试官说思路没问题。
下面我们一起跟着他的视角完整看一下他做这道题的过程:
面试的时候,给了我一张工资表,这表的字段有员工工号、部门还有工资。任务呢,就是要算出各部门除去最高工资和最低工资后的平均工资。我当时就想,嘿,简单~这题我会呀。
我是这么想的,先用一个开窗函数,比如用 RANK() 来给每个部门的工资进行排序,这样就能标记出最低工资。代码大概像这样:
SELECT *, RANK() OVER (PARTITION BY 部门 ORDER BY 工资) AS rank_numFROM 工资表
接着再用一个开窗函数,比如 MAX() 来找出每个部门的最高工资。代码类似这样:
SELECT *, MAX(工资) OVER (PARTITION BY 部门) AS max_salaryFROM 工资表;
然后把标记出来的最低工资和最高工资给排除掉,再算平均工资。我觉得这思路那是一点问题都没有。
我信心满满地写完代码,结果一调试,哎呀,死活跑不出来。我这心里就有点慌了。但是面试官却说我的思路没问题。这可把我给郁闷坏了。我就一直在想,到底是哪儿出问题了呢?是我的语法写错了?还是我的逻辑有漏洞?我反复检查了好几遍代码,当时就是找不出问题所在。
哎,这次面试虽然面试官说思路没问题,但这代码没跑出来也是个大问题啊。看来我还得回去好好练练,下次可不能再犯这样的错误了。
面试过后凭着记忆,重新梳理了一下,终于跑出来了,借着土哥的这个平台,分享给大家。
正确代码示例:
WITH temp_table AS (SELECT *,RANK() OVER (PARTITION BY 部门 ORDER BY 工资) AS rank_num,MAX(工资) OVER (PARTITION BY 部门) AS max_salaryFROM 工资表)SELECT 部门, AVG(工资) AS avg_salary_excluding_min_maxFROM temp_tableWHERE rank_num > 1 AND 工资 < max_salaryGROUP BY 部门;
end
增值服务:简历修改+面试辅导|Flink资料|ChatGpt|模拟面试
你好,我是土哥,计算机硕士毕业,现某大厂资深大数据开发工程师。出生在一个 18 线开外的小村庄,通过自己努力毕业一年在新一线城市买房,在社招、校招斩获 25 家中大厂 offer。
秋招第一枪已经打响,同学们一定要重视,社招的同学也要把握好跳槽时机。如果你是一个人孤军奋战,苦于无人指导、复习无从下手,或者不擅长写简历,手上只有拿不出手的毫无难点亮点的项目经历...
那么我的第一建议是多和身边的大佬沟通,哪怕是付费咨询,只要你能从他身上学到经验,那就是值得的。如果身边没有这样的人,那么我就毛遂自荐一下哈,要知道,茫茫网络你能看到这篇文章就是一种缘分。
土哥社招参加 28 场面试,100% 通过率,拿到全部 offer!
土哥这半年的悲惨人生,经历过被鸽 offer,最终触底反弹~

原文作者:3分钟秒懂大数据;如有侵权,请联系管理员删除。