SELECT * FROM (
select T.*,ROW_NUMBER()OVER(PARTITION BY 班级 order by 成绩 desc) RN
FROM T
)WHERE RN<=10

解决方案 »

  1.   

    ROW_NUMBER()OVER(PARTITION BY 
      

  2.   

    SELECT *FROM (SELECT * FROM 学生表ORDER BY 成绩 DESC) WHERE ROWNUM<=10;
      

  3.   

    SELECT *FROM (SELECT * FROM 学生表ORDER BY 成绩DESC) WHERE ROWNUM<=10;
    这要利用伪列
      

  4.   

    这个注意,不能使用 row_number() 应该使用 rank() 。避免有两个第 10 名的情况,丢掉其中一个。
    如果LZ 有时间的, 可以研究一下 dense_rank , rank , row_number 的区别。
    SELECT * FROM (
    select T.*,RANK() OVER(PARTITION BY 班级 order by 成绩 desc) RN
    FROM T
    )WHERE RN<=10
      

  5.   

    ++
    楼主,排名用rank,dese_rank吧with table_name(id,sc)as(
    select 1,90 from dual
    union all
    select 2,90 from dual
    union all
    select 3,90 from dual
    union all
    select 4,77 from dual
    )
    SELECT id, sc, rank() over(ORDER BY sc DESC) rk, dense_rank() over(ORDER BY sc DESC) drk
      FROM table_name;--结果
            ID         SC         RK        DRK
    ---------- ---------- ---------- ----------
             1         90          1          1
             2         90          1          1
             3         90          1          1
             4         77          4          2
    --通过这组数据可以看出相同排名后是否跳名次区别而已。