知识大全 oraclerank()函数总结
Posted 知
篇首语:曾无好事来相访,赖尔高文一起予。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 oraclerank()函数总结相关的知识,希望对你有一定的参考价值。
首先 要了解rank在英语的意思 等级 也就是说这是一个给数据确定等级的函数
以销售为例 有地区 年 月 销售员 销售额 记录这五个字段 我们可以按地区 年 月 销售额对销售员进行排序 这样对销售员来说就相当于有一个等级概念了 第一名就是销售最高的 如果我们要找出每个地区 年 月 销售额的前三名销售员 SQL如何写?
Sql代码
SELECT area_code YEAR MONTH saleroom saler
RANK () OVER (PARTITION BY area_code year month ORDER BY area_code year month saleroom ) RANK
FROM t_sale
Sql代码
SELECT
RANK( SHENZHEN ) WITHIN GROUP
(ORDER BY area_code year month saleroom) Rank
FROM T_SALE
上面这个SQL就可以搞定了 要注意的是 Rank()里的参数必须为常数 或常值表达式 里面参数的个数 类型也要和order by后字段的类型相对应
上面就是Rank函数的两个用法 另外还有一个dense_rank() 它的用法和rank()一样 只是计算等级的方式不同 例如上面的
用dense_rank() 就是
其实现在Oracle对于rank和dense_rank已经支持合计功能 不过这次我仅仅使用了其分析功能 具体语法如下 RANK ( ) OVER ( [query_partition_clause] order_by_clause )
下面给出一些来自网上的示例
TABLE S (subject mark)
数学
语文
数学
数学
数学
语文
语文
语文
现在我想要的结果是 每门科目的前 名的分数
数学
数学
数学
语文
语文
语文
那么语句就这么写
select * from (select rank() over(partition by subject order by mark desc) rk S * from S) T
where T rk<= ;
dense_rank与rank()用法相当 但是有一个区别 dence_rank在处理相同的等级时 等级的数值不会跳过 rank则跳过 row_number() 补充
例如 表
A B C
a liu wang
a jin shu
a cai kai
b yang du
b lin ying
b yao cai
b yang
例如 当rank时为
select m a m b m c rank() over(partition by a order by b) liu from test m
A B C LIU
a cai kai
a jin shu
a liu wang
b lin ying
b yang du
b yang
b yao cai
而如果用dense_rank时为
select m a m b m c dense_rank() over(partition by a order by b) liu from test m
A B C LIU
a cai kai
a jin shu
a liu wang
b lin ying
b yang du
b yang
b yao cai
而如果用row_number()时为
select m a m b m c row_number() over(partition by a order by b) liu from test m
A B C LIU
a cai kai
a jin shu
a liu wang
b lin ying
b yang du
b yang
b yao cai
现在RANK 就是 有了这个字段 就很容易得到前三名的销售员了
cha138/Article/program/Oracle/201311/18955相关参考