oracle中表A有字段id,name,age,表B有字段id,subject,score,id为学生学号,subject为科目,score分数

怎么查找每门功课前两名学生的ID,name ,subject ,score 。急求,写下思路和具体sql语句,非常感谢!!!

第1个回答  2011-07-22
这个可以拿到并列名次,
SELECT A.id, A.name, A.age, A.score
FROM (select subject, id, score, rank() over(partition by subject order by score desc) rk from B) t,
A
WHERE t.rk <= 2 AND A.id = t.id

如果不要并列名次,把那个rank()改为row_number()即可追问

哥们,那个score字段不在表A中啊,你查错了

追答

SELECT A.id, A.name, A.age, t.score
FROM (select subject, id, score, rank() over(partition by subject order by score desc) rk from B) t,
A
WHERE t.rk <= 2 AND A.id = t.id

哥们,是t.score打错了。

第2个回答  2011-07-23
select * from (select a.id,name,subject,sum(score) from a,b where a.id=b.id group by a.id,name,subject order by sum(score) desc ) where subject=&p_subject and rownum<=2追问

错了

第3个回答  2011-07-22
select t.*
from (select b.id,
a.name,
b.score,
b.subject,
row_number() over(partition by b.subject order by b.score desc) rn
from A a, B b
where a.id = b.id) t
where t.rn<=2追问

没并列名次的

追答

row_number()排名不会出现并列的 第一名 第二名 第三名
Dense_rank() 会有并列名次,例如:第一名 第一名 第二名
rank() 会有并列名次,例如:第一名 第一名 第三名
上面例子是两个第一名分数相同。自己想要什么结果自己看着办

本回答被提问者采纳
相似回答