一个小例子的问题
有一个学生表,里面有 学号 功课编号
学生成绩三个字段.用一个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