题解 | #找出每个学校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) 更严谨一些
10 回复 分享
发布于 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 河北

相关推荐

评论
376
82
分享

创作者周榜

更多
牛客网
牛客企业服务