SELECT *FROM (SELECT * FROM 学生表ORDER BY 成绩 DESC) WHERE ROWNUM<=10;
SELECT *FROM (SELECT * FROM 学生表ORDER BY 成绩DESC) WHERE ROWNUM<=10; 这要利用伪列
这个注意,不能使用 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
++ 楼主,排名用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 --通过这组数据可以看出相同排名后是否跳名次区别而已。
这要利用伪列
如果LZ 有时间的, 可以研究一下 dense_rank , rank , row_number 的区别。
SELECT * FROM (
select T.*,RANK() OVER(PARTITION BY 班级 order by 成绩 desc) RN
FROM T
)WHERE RN<=10
楼主,排名用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
--通过这组数据可以看出相同排名后是否跳名次区别而已。