题解 | #找出每个学校GPA最低的同学#

找出每个学校GPA最低的同学

http://www.nowcoder.com/practice/90778f5ab7d64d35a40dc1095ff79065

题意明确:

每个学校gpa最低的同学

问题分解:

  • 限定条件:gpa最低,看似min(gpa),但是要留意,是每个学校里的最低,不是全局最低。min(gpa)的时候对应同学的ID丢了,直接干是拿不到最低gpa对应的同学ID的;
  • 每个学校最低:
    • 第一种方式是用group by把学校分组,然后计算得到每个学校最低gpa,再去找这个学校里和这个gpa相等的同学ID。注意这样如果最低gpa对应多个同学,都会输出,题目没有明确此种情况,心理明白就行。
    • 第二种方式是利用窗口函数,先按学校分组计算排序gpa,得到最低gpa的记录在用子查询语法拿到需要的列即可。此题中rou_number可以得到排序后的位序,取位序为1即可得到最小值(升序时)。
  • 窗口函数语法:row_number/rank/dense_rank over (partition by FIELD1 order by FIELD2),传送链接

细节问题:

  • 如果题目明确了有多个最低gpa情况下,输出结果情况,需要留意
  • 表头重命名:as

完整代码:

select a.device_id, a.university, a.gpa
from user_profile a
right join
(
    select university, min(gpa) as gpa
    from user_profile
    group by university
) as b
on a.university=b.university and a.gpa=b.gpa
order by a.university

-- 方法二:
select device_id, university, gpa
from (
    select *, 
    row_number() over (partition by university order by gpa) as rn
    from user_profile
) as univ_min
where rn=1
order by university
全部评论
row_number() over (partition by university order by gpa)改为rank() over (partition by university order by gpa) 更严谨一些
11 回复 分享
发布于 2022-04-10 21:30
大家注意,用row_unmber不够严谨,如果出现最低gpa有2个以上的人,这个窗口函数只能取到1个人。所以用rank才是最严谨的,同分数的人排名都一样,都会取到。
8 回复 分享
发布于 2023-01-27 11:33 上海
啊这,不对,我说楼上为啥都说这个题有问题。这个题数据太弱了。第一,每个学校gpa最低的竟然就一个人,方法一是对的,而方法二显然应该用rank()而不是row_number()。第二,方法二很巧合地partition后的university顺序已经有序了...结果导致不用写 order by university也过了,一楼讲方法一,方法一运气并不好,去掉order by后并不能过。
4 回复 分享
发布于 2022-12-11 14:43 辽宁
rn=1啥意思
3 回复 分享
发布于 2022-08-20 16:38 北京
请问一下为什么方法一使用链接要用两个连接条件,我只用了一个a.gpa=b.gpa就会出错,返回结果中有两条一样的数据记录?
1 回复 分享
发布于 2023-08-09 10:12 湖南
为什么where rn=1不能写在from()中呢?
1 回复 分享
发布于 2023-03-05 22:16 天津
这个题好像有问题哦,一个学校如果出现多个最低gpa,那么该取哪个device_id呢
1 回复 分享
发布于 2022-11-18 23:52 北京
请问方法一为什么不加order by a.university是错的呢,我没太理解这个逻辑。因为a表right join b表 on university and gpa不就可以把两个表链接上了吗,为什么还要加order by a.university
1 回复 分享
发布于 2022-07-07 15:44
方法二,as univ_min 是啥意思
1 回复 分享
发布于 2022-03-20 15:52
请教,方法二哪里使用窗口函数?我只看到用了子函数
1 回复 分享
发布于 2022-02-28 22:40
为什么方法一最后不用写order by university ?
1 回复 分享
发布于 2022-01-06 21:09
方法2是不是用rank()会好点,不然如果有同一个大学有两个一样最小的gps,只会出来一个吧
点赞 回复 分享
发布于 2024-09-12 11:43 广东
SELECT device_id,university,gpa FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY university ORDER BY gpa) as rank FROM user_profile ) AS t1 WHERE rank = 1 ORDER BY university; 为什么我的运行不出来
点赞 回复 分享
发布于 2024-01-11 14:59 北京
有人解答一下吗,我用SQL解答这个题直接用这个select ump, min(gpa) from emp13 group by ump order by ump;就能求出来,我没看懂为啥还要用窗口函数
点赞 回复 分享
发布于 2023-11-23 12:06 重庆
听不懂思密达
点赞 回复 分享
发布于 2023-10-17 09:17 浙江
不太明白为什么where rn=1不能写在子查询里呢
点赞 回复 分享
发布于 2023-08-19 23:23 辽宁
方法一用inner join也可以通过
点赞 回复 分享
发布于 2023-08-02 10:11 浙江
窗口函数没学过的,可以先看作者留下的传送链接。里面有教程
点赞 回复 分享
发布于 2023-05-29 21:37 浙江
university不是数据怎么可以排序
点赞 回复 分享
发布于 2022-10-21 11:07 陕西
查询出最低分的
点赞 回复 分享
发布于 2022-09-11 09:20 河北

相关推荐

06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
点赞 评论 收藏
分享
来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
评论
387
82
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务