select * from (
select tbname.*,rank() over(partition by  班级 order by 成绩 desc) rk 
from tbname ) t
where rk<3; 10:17:56 SQL> select * from sc;S#         C#              GRADE
---------- ---------- ----------
001        A                  80
001        B                  90
001        C                  78
002        C                  76
003        A                  80
003        B                  90
004        A                  80
004        B                  89
004        C                  90已选择9行。已用时间:  00: 00: 00.47
10:20:25 SQL> select * from (
10:20:30   2  select sc.*,rank() over(partition by s# order by grade desc) rk from sc) t
10:20:38   3  where rk<3;S#         C#              GRADE         RK
---------- ---------- ---------- ----------
001        B                  90          1
001        A                  80          2
002        C                  76          1
003        B                  90          1
003        A                  80          2
004        C                  90          1
004        B                  89          2已选择7行。已用时间:  00: 00: 00.31
10:20:40 SQL>

解决方案 »

  1.   

    to bzszp(SongZip):
    谢谢你的答案。不过我有些不明白:
    "rank() over(partition by  班级 order by 成绩 desc) rk from tbname"
    其中rank() over和partition by 我以前都没见过,可不可以解释一下,万分感谢
      

  2.   

    oracle的分析函数rank()  over(partition  by    班级  order  by  成绩  desc)
    加上 按照"班级"分组,并根据 "成绩"降序排序后的序号
      

  3.   

    如果某个班级有两个以上的并列第一名呢?
    用下面这个函数保险哦:
    dense_rank() over(partition by...)
      

  4.   

    bzszp(SongZip) 真得很厉害.佩服佩服!
      

  5.   

    问题已解决了,谢谢各位了
    以下是我找的关于rank()的使用方法,供大家参考:
    rank() over (partition by col1 order by col2) 
    表示根据col1分组,在分组内部根据 col2排序
    排序的时候跟派名次一样,可以并列2个第一名之后 是第3名结帖!