日期:2014-05-17  浏览次数:20822 次

一个小例子的问题
有一个学生表,里面有 学号 功课编号
学生成绩三个字段.用一个SQL查询语句得出每门功课成绩最好的前两名

学号 功课编号 学生成绩
 1 1 99
 2 1 98
 3 1 100
 4 2 88
 5 2 87
 6 2 88
 7 3 99
 8 3 88
 9 3 100


SELECT 学生表1.* 
FROM 学生表 学生表1 WHERE 学生表1.学号 IN 
(SELECT TOP 2 学生表.学号 
FROM 学生表 
WHERE 学生表.功课编号 = 学生表1.功课编号 
ORDER BY 学生成绩 DESC)


我就是想不明白,为什么要用自连接,学生表.功课编号 = 学生表1.功课编号,本来不就是相等么??

------解决方案--------------------
楼上的不错的.
另wren4255 注意:
要的前两名中如果有分数一样,怎样取.
一种是用dense_rank() 如上例子中取两名时实际是三个人,另一种可以用Rank.

select *
from (select cn,
kn,
score,
rank() over(partition by kn order by score desc) num
from t)
 where num <= 2;


--结果-------------------
SEQ CN KN Score Num
1 3 1 100 1
2 1 1 99 2
3 4 2 88 1
4 6 2 88 1
5 9 3 100 1
6 7 3 99 2