您的位置:首页 > 数据库

SQL 排名函数

2008-12-22 09:49 274 查看
         在业务中经常对某些数据排序后去编号,好多时候是在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的作用,是强大的,有时间在好好研究一番。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql 数据库