这个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,应该怎么写呢?

解决方案 »

  1.   


    select k.*
      from (select sid,
                   cname,
                   score,
                   rank() over(partition by cname order by score desc) rn
              from t) k
     where k.rn <= 2
      

  2.   

    select m.* from
    (
      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
      

  3.   

    select id,cname from 
       (select id,cname,rank () over (partition by cname order by score desc) rk
        from t)
    where rk<=2;
      

  4.   


    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> 
      

  5.   

    select sid,row_number()OVER(PARTITION BY cName) row_num
    from t where row_num<=2;
      

  6.   

    select k.* from (select sid,cname,score,rank() over(partition by cname order by score desc) rn from t) k
      

  7.   

    Select * from 
    (select id,cname,row_number() over (partition by id 
    order by cname desc) rn 
    from emp) 
    where rn<=3 
      

  8.   

    Select * from 
    (select id,cname,row_number() over (partition by id 
    order by cname desc) rn 
    from emp) 
    where rn <=2 
      

  9.   

    select sid,cName
    from T a
    where 2>(select count(*) from T where cName=a.cName and score>a.score)