这个SQL语句怎么写?
现在有一个表T,里面就3个字段
学生ID(sid)课程(cName)成绩(score)
1 1 75
2 2 90
3 2 60
4 3 89
5 3 80
6 3 70
我现在想知道得到的结果是:每门课程排在前两名的学生的ID,应该怎么写呢?
现在有一个表T,里面就3个字段
学生ID(sid)课程(cName)成绩(score)
1 1 75
2 2 90
3 2 60
4 3 89
5 3 80
6 3 70
我现在想知道得到的结果是:每门课程排在前两名的学生的ID,应该怎么写呢?
select k.*
from (select sid,
cname,
score,
rank() over(partition by cname order by score desc) rn
from t) k
where k.rn <= 2
(
select t.* , row_number() over(partition by cName order by score desc) px from tb t
) m
where px <= 2select m.* from
(
select t.* , (select count(1) from tb where cName = t.cName and score > t.score) + 1 from tb t
) m
where px <= 2
(select id,cname,rank () over (partition by cname order by score desc) rk
from t)
where rk<=2;
SQL>
SQL> with t as (
2 select 1 sid, 1 cname, 75 score from dual union all
3 select 2, 2, 90 from dual union all
4 select 3, 2, 60 from dual union all
5 select 4, 3, 89 from dual union all
6 select 5, 3 ,80 from dual union all
7 select 6, 3 ,70 from dual
8 )
9 select k.*
10 from (select sid,
11 cname,
12 score,
13 rank() over(partition by cname order by score desc) rn
14 from t) k
15 where k.rn <= 2
16 / SID CNAME SCORE RN
---------- ---------- ---------- ----------
1 1 75 1
2 2 90 1
3 2 60 2
4 3 89 1
5 3 80 2SQL>
from t where row_num<=2;
(select id,cname,row_number() over (partition by id
order by cname desc) rn
from emp)
where rn<=3
(select id,cname,row_number() over (partition by id
order by cname desc) rn
from emp)
where rn <=2
from T a
where 2>(select count(*) from T where cName=a.cName and score>a.score)