sql高手求助

来源:百度知道 编辑:UC知道 时间:2024/05/22 17:12:35
有一个表“chengjibiao”里面有name,banji,chengji,id字段
name是学生名称,banji是班级,chengji是成绩

帮我找出各班里成绩最大的学生名字!
只要名字!
谢谢了。

*********************************
SqlServer、oracle、mysql、access都支持的写法:
*********************************
select xingming from chengjibiao tmp1 inner join
(select banji,max(chengji) as cj from chengjibiao group by banji) tmp2
on tmp1.banji=tmp2.banji and tmp1.chengji=tmp2.cj;

说明:这种写法是非常一般性的写法,SqlServer、oracle、mysql、access都支持(我都试验过了)。

*********************************
仅仅oracle中支持的写法(很方便):
*********************************
考虑重分的情况(如最高分有两个,俩人都是100分)就用下面的sql:

select name from(
select name,rank()over(partition by banji order by chengji desc) paiming from chengjibiao)
where paiming=1;

说明:oracle支持这种查询方法,另外记住一定要用rank,这样才能把分数相同且都是最高分的人名都找到,用row_number()会丢数据。
另外如果找第二名直接把【paiming=1;】改成【paiming=2;】即可。

如果更进一步考虑重分的情况:
如有:A 100分 B 99分 C99分 D98分 E97分的名次是:
※第一名:A,第二名:B,C 第四名:D 第五名:E
直接用我写的sql
※第一名:A,第二名:B,C 第三名:D 第四名:E
就把我写的sql中的【rank()】改成【dense_rank()】即可。