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的作用,是强大的,有时间在好好研究一番。
数据库中有表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-OVER与四种排名函数:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()
- SQL中排名函数
- Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数 <转>
- SQL Server 2005 T-SQL 学习笔记:排名函数
- 排名函数 (Transact-SQL)
- SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
- Oracle sql 排名分析函数
- Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数
- T-SQL排名函数
- SQL中的排名函数
- sql 四个排名函数 生成记录序号
- MS SQL Server:排名函数详解
- SQL查询排名函数实例
- Sql Server2005对t-sql的增强之排名函数
- Sql Server2005对t-sql的增强之排名函数 (转)
- SQL 排名函数
- SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
- Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数 转
- SQL点滴20—T-SQL中的排名函数
- SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较