表emp 字段:姓名name 课程class  成绩score。
求各门课程的前两名同学的姓名,成绩,和课程,成绩按照降序排列。
我这个没有思路,不知道该咋下手.求答案。

解决方案 »

  1.   

    select * from 
    (select name
           ,class
           ,score
           ,row_number() over(partition by class order by score desc nulls last) rn
    from emp
    )t
    where rn<=2
    order by class,score
    ;
      

  2.   

    懂得用排名函数row_number()
    就可以解决
      

  3.   

    支持一楼!
    Oracle分析函数很好解决你的需求
    select * from  
    (select 
       name
      ,class
      ,score
      ,row_number() over(partition by class order by score desc nulls last) rn
    from emp
    )t
    where rn<=2
    order by class,score desc
    ;
      

  4.   

    正解在此:select name,class,score from(select name,class,score,rank() over(partition by class order by score desc)t from emp) where t<3;
      

  5.   


    ----sinpoal
    ----table-----------
    create table emp(
    name varchar(10),
    class varchar(10),
    score number )---------sql statment---------
    select p.name,p.score,p.class from (
    select 
    row_number() over(partition by class order by score desc) no,c.* from emp c
     order by class ,score desc) p where p.no in(1,2)
    /*----------------result----------
    1 lucy 80 chinese
    2 tom 76 chinese
    3 lucy 85 english
    4 jeey 81 english
    */
      

  6.   

    哦。。说错了 5、6的问题是一样的,用这个合适:
    select name,class,score from(select name,class,score,dense_rank() over(partition by class order by score desc)t from emp) where t<3;
      

  7.   


    select name,class,score
    from (select name,class,score,
    dense_rank() over(partition by class order by score desc) rn
    from emp) a
    where a.rn<3
      

  8.   

    用rank()就可以了,rank()是跳跃排序的,就是有并列第二的话排出来就没第三名了,直接第四名,但dense_rank()还有第三名。
      

  9.   

    vber1010 说对了 的要对相同成绩的人不适合row_number() 的用dense_rank()