1、首先,要了解rank在英语中的意思:等级,也就是说这是一个给数据确定等级的函数。
具体语法为:
RANK() OVER ([query_partition_clause] order_by_clause)
2、以销售为例,有地区、年、月、销售员、销售额,记录这5个字段。我们可以按地区,年,月,销售额对销售员进行排序,这样对销售员来说就相当有一个等级概念了,第一名就是销售最高的。如果我们要找出每个地区、年、月、销售额的前三名销售员,SQL语句如何写?
SELECT AREA_CODE, YEAR, MONTH, SALEROOM, SALER, RANK() OVER(PARTITION BY AREA_CODE, YEAR, MONTH ORDER BY AREA_CODE, YEAR, MONTH, SALEROOM) SALE_RANK FROM SALE_TABLE;
3、 新问题:销售额50000快在深圳,2007年5月能排到第几?
sql代码为:
SELECT RANK('BEIJING', 2007, 5, 50000) WITHIN GROUP (ORDER BY AREA_CODE, YEAR, MONTH, SALEROOM) SALE_RANK FROM SALE_TABLE;上面这个SQL就可以搞定了,要注意的是,Rank()里的参数必须为常数,或常量表达式,里面参数的个数、类型也要和order by后字段的类型相对应。
4、下面用一些示例来进行训练
1)TABLE : S (SUBJECT , MARK)
SUBJECT | MARK |
数学 | 80 |
语文 | 70 |
数学 | 90 |
数学 | 60 |
数学 | 100 |
语文 | 88 |
语文 | 65 |
语文 | 77 |
现在我想要的结果是:每门科目的前三名的分数:
SUBJECT | MARK |
数学 | 100 |
数学 | 90 |
数学 | 80 |
语文 | 88 |
语文 | 77 |
语文 | 70 |
那么语句就可以这样写:
SELECT * FROM (SELECT A.SUBJECT, A.MARK, RANK() OVER(PARTITION BY SUBJECT ORDER BY SUBJECT, MARK DESC) MARK_RANK FROM S ) B WHERE B.MARK <= 3;
5、DENSE_RANK()与RANK()用法相当,但是有一个区别:DENCE_RANK()在处理相同的等级时,等级的数组不会跳过。RANK()则跳过,例如表TEST:
A | B | C |
a | liu | wang |
a | jin | shu |
a | cai | kai |
b | yang | du |
b | lin | ying |
b | yao | cai |
b | yang | gg |
例如:当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 | 1 |
a | jin | shu | 2 |
a | liu | wang | 3 |
b | lin | ying | 1 |
b | yang | du | 2 |
b | yang | gg | 2 |
b | yao | cai | 4 |
如果使用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 | 1 |
a | jin | shu | 2 |
a | liu | wang | 3 |
b | bin | ying | 1 |
b | yang | du | 2 |
b | yang | gg | 2 |
b | yao | cai | 3 |
参考链接: