首先要了解rank在英语的意思等级也就是说这是一个给数据确定等级的函数
以销售为例有地区年月销售员销售额记录这五个字段我们可以按地区年月销售额对销售员进行排序这样对销售员来说就相当于有一个等级概念了第一名就是销售最高的如果我们要找出每个地区年月销售额的前三名销售员SQL如何写?
Sql代码
SELECT area_code YEAR MONTH saleroomsaler
RANK () OVER (PARTITION BY area_codeyear month ORDER BY area_codeyearmonthsaleroom ) RANK
FROM t_sale
Sql代码
SELECT
RANK(SHENZHEN) WITHIN GROUP
(ORDER BY area_codeyearmonthsaleroom) 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 )
下面给出一些来自网上的示例
TABLES (subjectmark)
数学
语文
数学
数学
数学
语文
语文
语文
现在我想要的结果是每门科目的前名的分数
数学
数学
数学
语文
语文
语文
那么语句就这么写
select * from (select rank() over(partition by subject order by mark desc) rkS* from S) T
where Trk<=;
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 mambmcrank() 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 mambmcdense_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 mambmcrow_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 就是有了这个字段就很容易得到前三名的销售员了
新问题:销售额块在深圳年月能排到第几?