在业务中经常对某些数据排序后去编号,好多时候是在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 Server怎么不排序进行编号
转载文章标签 SQL Server怎么不排序进行编号 sql 数据库 返回结果 结果集 文章分类 SQL Server 数据库
上一篇:java tsc 标签 打印
下一篇:极空间 下载不了 docker
-
SQL Server 账号管理1
SQL Server 账号管理主要包含登录名、用户、架构、角色等管理。通过对账号的管理可以有效的提高数据库系统的安全性,规范运维及使用。注意:登录名是实例下的安全对象,用户、架构及角色是数据库下的安全对象
登录名 用户名 数据库级的主体 SQL Server 级的主体 安全对象