rank()对表中的数据进行分级排序

譬如有张学生成绩统计单的表STUDENT_RESULT
name number kemu fenshu
li 0113101 高数 90
zhang 0113098 高数 80
wang 0113077 高数 70
li 0113101 物理 80
zhang 0113098 物理 90
wang 0113077 物理 70

我如果要检索出表中高数的前两名和物理的前两名
那么可以通过使用 RANK()方法达到目的

--首先 通过kemu进行分类,然后按照fenshu降序排序
select rank() over(partition by kemu order by fenshu desc) rk,t.* from student_result t

结果
rk name number kemu fenshu
1 li 0113101 高数 90
2 zhang 0113098 高数 80
3 wang 0113077 高数 70
1 zhang 0113098 物理 90
2 li 0113101 物理 80
3 wang 0113077 物理 70

--然后,检索出rk<=2的记录,即取出前两名
select * from (select rank() over(partition by kemu order by fenshu desc) rk,t.* from student_result t) as y where y.rk<=2;

结果
rk name number kemu fenshu
1 li 0113101 高数 90
2 zhang 0113098 高数 80
1 zhang 0113098 物理 90
2 li 0113101 物理 80

dense_rank()和 rank()的用法完全相同,不同的是在出现分数相同的情况下
如
name number kemu fenshu
li 0113101 高数 80
zhang 0113098 高数 80
wang 0113077 高数 70
li 0113101 物理 80
zhang 0113098 物理 90
wang 0113077 物理 70

select rank() over(order by fenshu desc) rk,t.* from student_result t
的结果为
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高数 80
2 zhang 0113098 高数 80
2 li 0113101 物理 80
5 wang 0113077 高数 70
5 wang 0113077 物理 70
而select dense_rank() over(order by fenshu desc) rk,t.* from student_result t
结果为
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高数 80
2 zhang 0113098 高数 80
2 li 0113101 物理 80
3 wang 0113077 高数 70
3 wang 0113077 物理 70

附 row_number()的使用

select row_number() over(order by fenshu desc) rk,t.* from student_result t
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高数 80
3 zhang 0113098 高数 80
4 li 0113101 物理 80
5 wang 0113077 高数 70
6 wang 0113077 物理 70

fetch n rows only
取出当前记录的前多少行

如
select row_number() over(order by user_no) from user_files fetch first 5 rows only;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值