查询各科分数最高的科目名称,学生学号,姓名,分数,排名

查询各科分数最高的科目名称,学生学号,姓名,分数,排名

1.有三个表student(学生表),sc(成绩表),course(课程表),其定义和数据如下
student:
sidsnamesagessex
01赵雷1990-01-01
02钱电1990-12-21
03孙风1990-12-20
04李云1990-12-06
05周梅1991-12-01
06吴兰1992-01-01
07郑竹1989-01-01
09张三2017-12-20
10李四2017-12-25
11李四2012-06-06
12赵六2013-06-13
13孙七2014-06-01
sc:
sidcidscore
010180
010290
010399
020170
020260
020380
030180
030280
030380
040150
040230
040320
040460
050176
050287
060131
060334
070289
070398
course:
cidcnametid
01语文02
02数学01
03英语03
04生理学04
解题思路:
1.首先给sc表按照cid分区按照分数降序排序,最后加个排名
select cid,sid,score,row_number() over (partition by CId order by score desc) ranks 
from sc

这里不会row_number() over()函数的同学自行百度,搞清楚rank(),dense_rank(),row_number()的区别,以及配上over()函数的用法。

查询结果为:

在这里插入图片描述

2.然后和student表、course表连接起来,如果有多个最高分,按照名字的先后顺序排序。
select sc.cid,c.cname,sc.sid,s.sname,sc.score,row_number() over (partition by sc.CId order by sc.score desc,s.sname) ranks 
from sc,student s,course c
where s.sid = sc.sid and sc.cid=c.cid

查询的结果为:

在这里插入图片描述

3.要选取每科的最高分,那么我们把上面查询的结果看做一个表,查询条件为ranks=1,那么就是选取的每科的最高分,如果说题目是选取每科的前3名,我们只要加条件ranks<=3就可以了,我们来看代码。
select *
from(
	select sc.cid,c.cname,sc.sid,s.sname,sc.score,row_number() over (partition by sc.CId order by sc.score desc,s.sname) ranks 
	from sc,student s,course c
	where s.sid = sc.sid and sc.cid=c.cid
)a
where ranks=1

查询结果:
在这里插入图片描述

结果没问题,我们来看看每科前3的sql和查询结果。

select *
from(
 select sc.cid,c.cname,sc.sid,s.sname,sc.score,row_number() over (partition by sc.CId order by sc.score desc,s.sname) ranks 
 from sc,student s,course c
 where s.sid = sc.sid and sc.cid=c.cid
)a
where ranks<=3

查询结果:

在这里插入图片描述
结果没毛病,如果大家有更好的方法,或者更高效的方法可以一起讨论,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值