100天SQL面试刷题 Day001

先看题目自己试着解一下,有困难的同学可以先看考点解析试下,
最后再看SQL解答,有不同意见和解法的欢迎评论区留言交流

题目:

来源:大厂(HW)面试真题

表T2包含了员工所在部门、工号、姓名,
表T1记录了各部门对一个产品的评价,可以多次打分,
筛选出每人评价的最高分的记录,并输出部门,姓名,评分,没有姓名的用工号代替。

表T1:

部门工号分数
A170
A270
A290
A280
A180
B16
B17
B18
C180

表T2:

部门工号姓名
A1
A2
B1

题目下载

结果输出

在这里插入图片描述

考点解析

  1. 分组聚合group by
  2. ifnull
IFNULL(expression_1,expression_2);
--如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果
  1. left join
  • 先使用group by +max聚合出每个人的最高评分,需要使用部门和工号一起聚合,因为不同部门的工号是会重复的,部门+工号才是唯一的
select 部门,工号,max(分数)
FROM t1
group by 部门,工号`
  • left join 以聚合后的表为基准表,匹配t2员工信息表中的员工姓名,
select * from (select 部门,工号,max(分数)
FROM t1
group by 部门,工号) tmp
left join t2
on tmp.部门 = t2.部门
and tmp.工号 = t2.工号
  • 对姓名加一个ifnull判断, 没匹到的使用工号替代
select tmp.部门, ifnull(t2.姓名,tmp.工号) 员工, tmp.评分 from (select 部门,工号,max(分数) 评分
FROM t1
group by 部门,工号) tmp
left join t2
on tmp.部门 = t2.部门
and tmp.工号 = t2.工号

SQL代码

select t1.部门,
ifnull(姓名,t1.工号) 员工,
max(分数) FROM t1
left join t2
on t2.部门 = t1.部门 and t2.工号 = t1.工号
group by t1.部门,t1.工号

延伸思考

  • 分析函数 sum max min 分组时,什么时候需要开窗 over() 什么时候使用group by 直接聚合
    聚合结果需要跟每行去运算时候使用over可以保留原值,否则不需要用over
    eg:本题改为 去除最高和最低分的平均打分

  • eg:本题改为 去除1个最高份和1个最低分的平均打分

  • 【注】:开窗后的字段不能直接筛选 ,必须在外面嵌套一层查询(不能where 也不能having 区别于其他计算衍生字段(能having不能where))

注意事项

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诡途

你的鼓励是我 创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值