Oracle分析函数之Rank函数

本文主要讲述Oracle分析函数之Rank函数的用法

最近接触到Oracle这个功能强大而灵活的函数。这个函数特别适用于各种统计查询,下面就来说一说。

首先存在 product 表

SELECT p.create_time, p.name, p.service_evaluate_fee, p.product_type FROM product p

表数据如下:

这里写图片描述

ROW_NUMBER()
SELECT 
row_number() OVER(PARTITION BY p.product_type ORDER BY p.update_time DESC) 
row_number, p.create_time, p.name, p.product_type 
FROM product p

执行结果如下:

这里写图片描述

这里写图片描述

SQL执行意思为根据产品类型来分类的同时,根据创建时间create_time来排序

SELECT * FROM 
(
SELECT row_number() 
OVER(PARTITION BY p.product_type ORDER BY p.update_time DESC) row_number, 
p.create_time, p.name, p.product_type 
FROM product p
) pp 
WHERE pp.row_number <= 10 AND pp.row_number >5

row_number()还可以用来做分页数据,查询结果如下:

这里写图片描述

RANK()

SELECT 
rank() OVER(ORDER BY p.service_evaluate_fee DESC) rank,
p.service_evaluate_fee, p.create_time, p.name, p.product_type 
FROM product p

此处不再区分不同产品,只考虑服务评估费,service_evaluate_fee

执行结果如下:

这里写图片描述

DENSE_RANK()

SELECT 
dense_rank() OVER(ORDER BY p.service_evaluate_fee DESC) rank, 
p.service_evaluate_fee, p.create_time, p.name, p.product_type 
FROM product p

执行结果如下:
这里写图片描述

通过上述结果的比较,我们可以发现ROW_NUMBER(), RANK(), DENSE_RANK()的区别:

当结果集中如果出现两条相同的数据,那么rank会进行跳跃式的排名,
比如2个第一,那么没有第二,接下来就是第三;
dense_rank不会跳跃式的排名,两个第一接下来还是第二;
row_number,即使两条数据相同,每一条数据排名均不相同,因此适用于分页查询(页码必须是连续不跳跃的)。

SELECT 
row_number() OVER(ORDER BY p.service_evaluate_fee DESC) row_num, 
rank() OVER(ORDER BY p.service_evaluate_fee DESC) rank,
dense_rank() OVER(ORDER BY p.service_evaluate_fee DESC) dense_rank, 
p.service_evaluate_fee, p.create_time, p.name, p.product_type 
FROM product p

执行结果如下:

这里写图片描述

总结

语法 FUNCTION_NAME(参数,…) OVER(PARTITION BY 表达式,… ORDER BY 表达式 ASC DESC)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值