db2 中rank(),dense_rank()



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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值