使用RANK函数统计排行榜
RANK是一个从oracle 8.1.6 开始引入的统计函数。RANK的功能是按照某种分组方式计算出返回结果的排行。RANK函数有两个,一个是RANK,另外一个是DENSE_RANK。RANK排序在碰到并列值的时候,下一个排行序号会跳过并列的值,而DENSE_RANK排序的结果有并列排名,下一个排行顺序仅仅加一。
比如:
SQL> SELECT year, region, profit,dept ,
2 RANK() OVER ( ORDER BY profit DESC) as rk
3 FROM test;
YEAR REGION PROFIT DE RK
---- ------- ---------- -- ----------
2004 East 103 A 2 1
2003 East 102 A 1 2
2003 Central 101 A 1 3
2003 Central 100 A 2 4
2004 West 89 A 2 5
2003 West 88 A 1 6
2003 West 88 A 2 6
2004 West 77 A 1 8
2004 West 77 A 1 8
使用DENSE_RANK排名的结果为:
SQL> SELECT year, region, profit,dept ,
2 DENSE_RANK() OVER ( ORDER BY profit DESC) as rk
3 FROM test;
YEAR REGION PROFIT DE RK
---- ------- ---------- -- ----------
2004 East 103 A 2 1
2003 East 102 A 1 2
2003 Central 101 A 1 3
2003 Central 100 A 2 4
2004 West 89 A 2 5
2003 West 88 A 1 6
2003 West 88 A 2 6
2004 West 77 A 1 7
上面的例子是按照PROFIT进行排名。RANK函数支持分组排名,比如我们可以按照年份分组,然后计算排名:
SQL> SELECT year, region, profit,dept ,
2 RANK() OVER (PARTITION BY year ORDER BY profit DESC,REGION) as rk
3 FROM test;
YEAR REGION PROFIT DE RK
---- ------- ---------- -- ----------
2003 East 102 A 1 1
2003 Central 101 A 1 2
2003 Central 100 A 2 3
2003 West 99 A 2 4
2003 West 88 A 1 5
2004 East 103 A 2 1
2004 West 89 A 2 2
2004 West 77 A 1 3
这个查询首先对数据按照年份分组,然后在分组中计算排名。