SQL问题:各班前三名的学号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL问题:各班前三名的学号相关的知识,希望对你有一定的参考价值。

表T,有A,B,C三列,A是班级号,B是学号,C是成绩。
要求各班前三名的学号。请问该如何写SQL?

我们经常会有这样的需求,即按照地区来分别取出每个地区排名前3的那些记录。本文总结了几种方法,希望大家补充。

首先,创建测试用的表和数据,如下:

create table test
(
areaid int,
score int
)
insert into test select 0,10
union all select 0,20
union all select 0,30
union all select 0,40
union all select 0,50
union all select 1,10
union all select 1,20
union all select 1,30
union all select 1,40
union all select 1,50
union all select 2,10
union all select 2,20
union all select 2,30
union all select 2,40
union all select 2,50
go

第一种方法适用于sql2000和2005,其代码如下:

select * from test a
where checksum(*) in (select top 3 checksum(*) from test b where a.areaid=b.areaid order by score desc)

第二种方法是利用sql2005的函数ROW_NUMBER,其代码如下:

WITH test1 AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY areaid ORDER BY score desc) AS 'RowNumber'
FROM test
)
SELECT *
FROM test1
WHERE RowNumber BETWEEN 1 AND 3;

第三种方法是利用sql2005的cross apply来实现,其代码如下:

select distinct t.* from test a
cross apply
(select top 3 areaid,score from test
where a.areaid=areaid order by score desc) as T

这里提供了3种方法,
参考技术A 不小得楼上怎么会写得那么多哈!,,,,

select top 3 B
from T
group by A
order by C desc;

好像这样就行了哈!

C#统计出各班的每个学生的总成绩,并打印出每班的前三名成绩

不求代码,只求算法,我现在只能统计出每个班所有学生的总成绩,但是不知道怎么只打印出前三名,假设每个班有10个人
数据是从txt文档里面一行行读取的,比如这样:
1011234567广岛中学11100001赵一100100100100099
最后一串数字以每3个为一组,分别代表了5科成绩

你学生和学生的总成绩,用Dictionary<学号,成绩>,应该是Dictionary<string,int>来保存,
new 一个变量,Dictionary<string,int> totalScoreDic=new Dictionary<string,int>();
然后循环遍历所有学生,每次循环中又循环该生的所有成绩,并totalScoreDic[学号]+=该生成绩,循环完就得到每个学生总成绩了。
至于前三名只要对totalScoreDic遍历3次就好了,每次取出最大的那个,取出后将该个从totalScoreDic删掉。
参考技术A 1.不知道你文件格式,如果是cvs文件,直接用ado.net 读成datatable,剩下的东西估计你自己一会做
2.如果文件不是cvs,用stream流,readline一行一行读,同时把最后组每3位一截,截成5科的单独成绩
3.算法部分,如果要求只打印出每班前三名,则不必做全排序。按班级Dictionary做堆排序就ok了

堆排资料:http://baike.baidu.com/view/157305.htm
参考技术B 你把所有人成绩放到数组里,然后直接用Array.Sort排序(默认是升序排序),然后从数组最后一个元素起逆向输出三个就行了,那就是前三名。(当然象这种读取文件的话,Array可能不太适合,可以考虑用Dictionary或者两个List,这两个排序资料也不少了,自己查查看) 参考技术C 从txt文件中读出数据时,就应该得到他们的总成绩,然后再保存到Array中,然后用他内部了的排序方法得到最后 的结果哦! 参考技术D select top 3 * from (你的统计查询) ; 第5个回答  2012-05-17 可以放在数组里,然后通过冒泡排序进行排序,然后取数组下标的前三位。。

以上是关于SQL问题:各班前三名的学号的主要内容,如果未能解决你的问题,请参考以下文章

分组取前N记录(转)

SQL语句:查询各班成绩前3的同学姓名

JAVA排序的问题

趣味签到,开启活力一天

java基础 求3个班5个同学成绩

2019春招面试题总结-05