在业务中经常对某些数据排序后去编号,好多时候是在SQL语句中排好序,然后程序中手动添加序号,然而在SQL2005是有取序号的函数,这就是排名函数。下面举几个例子看看他们的用法。

       数据库中有表TableA,有两个字段,部门id(id),销售额(sale),记录的是某个部门某一次的销售额,数据如下:
id             sale
-------------------
1              15
2              10
3              20
4              10
2              30
3              10

下面分别看一下我们要探讨的排名函数:
ROW_NUMBER ( )      OVER ( [ partition_by_clause] order_by_clause )
返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
partition_by_clause将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
order_by_clause
确定将 ROW_NUMBER 值分配给分区中的行的顺序。

还是看例子吧,下例返回的是按照销售额升序排序的序列号:
select id,sale, ROW_NUMBER() over (order by sale) as RowNumber
from tablea
结果如下:
id              sale        RowNumber
--------------------------------------
2              10              1
4              10              2
3              10              3
1              15              4
3              20              5
2              30              6
如果既想取得上例中的RowNumber,有要让结果按照部门id进行排序只要用下面语句就可以了
select id,sale, ROW_NUMBER() over (order by sale) as RowNumber
from tablea
order by id
也就是说,ROW_NUMBER()只与后面的OVER的条件有关。

RANK ( )     OVER ( [   partition_by_clause   ] order_by_clause   )
返回结果集的分区内每行的排名。行的排名是相关行之前的排名数加一。
如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。例如,两次销售额相同并且最小,他们将拥有相同的名次第一。由于已有两行排名在前,下一个最小的销售额将排名第三。因此,RANK 函数并不总返回连续整数。
用于整个查询的排序顺序决定了行在结果集中的显示顺序。这也隐含了行在每个分区中的排名。
看下面的例子
select id,sale, Rank() over (order by sale) as RowNumber
from tablea
结果:
id              sale RowNumber
--------------------------------
2              10              1
4              10              1
3              10              1
1              15              4
3              20              5
2              30              6
同样如果还有其他条件,直接加在From句后面就可以了。

DENSE_RANK ( )     OVER ( [ partition_by_clause   ] order_by_clause   )
返回结果集分区中行的排名,在排名中没有任何间断。行的排名等于所讨论行之前的所有排名数加一。
如果有两个或多个行受同一个分区中排名的约束,则每个约束行将接收相同的排名。例如,两次销售额相同并且最小,他们将拥有相同的名次第一。接下来最小的销 售额将排名第二。该排名等于该行之前的所有行数加一。因此,DENSE_RANK 函数返回的数字没有间断,并且始终具有连续的排名。
整个查询所用的排序顺序确定了各行在结果中的显示顺序。这说明排名第一的行可以不是分区中的第一行。

还是看下面的例子:
select id,sale, DENSE_RANK () over (order by sale) as RowNumber
from tablea
运行结果:
id               sale RowNumber
---------------------------
2              10              1
4              10              1
3              10              1
1              15              2
3              20              3
2              30              4

上面的三个函数基本用法都是一样的,除了排名分页也是其重要的应用,他们都使用了OVER,其实OVER的用处很强大,如下例:
select id,sale, sum(sale) over (partition by id) as SUM
from tablea
结果:
id             sale SUM
---------------------------
1              15              15
2              10              40
2              30              40
3              10              30
3              20              30
4              10              10
既显示了部门的每次销售记录,有把各个部门的销售总额求出来。OVER的作用,是强大的,有时间在好好研究一番。