一个SQL写法,每个班级成绩排名前10的学生。

xj3palfeng 2014-11-06 02:06:31
老调重弹的SQL写法,最近很少写代码,一时间忘记了。求助
...全文
13499 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sych888 2014-11-12
  • 打赏
  • 举报
回复
用排名函数,依据是否存在并列的情况选择合适的排名函数
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:
这个注意,不能使用 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
--通过这组数据可以看出相同排名后是否跳名次区别而已。
卖水果的net 2014-11-11
  • 打赏
  • 举报
回复 2
这个注意,不能使用 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
ffshao 2014-11-10
  • 打赏
  • 举报
回复 1
SELECT *FROM (SELECT * FROM 学生表ORDER BY 成绩DESC) WHERE ROWNUM<=10; 这要利用伪列。。。
ffshao 2014-11-10
  • 打赏
  • 举报
回复
SELECT *FROM (SELECT * FROM 学生表ORDER BY 成绩 DESC) WHERE ROWNUM<=10;
空心兜兜 2014-11-07
  • 打赏
  • 举报
回复
ROW_NUMBER()OVER(PARTITION BY
bw555 2014-11-06
  • 打赏
  • 举报
回复
SELECT * FROM (
select T.*,ROW_NUMBER()OVER(PARTITION BY 班级 order by 成绩 desc) RN
FROM T
)WHERE RN<=10

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧