SQL Server 2005增加的排名函数
来源:互联网 发布:java 调整系统音量 编辑:程序博客网 时间:2024/06/16 23:01
排名函数是SQL Server 2005增加的一个非常受欢迎的特性,它允许我们在结果集中返回和每行关联的值。表8-8描述了4个新的排名函数。
表8-8 排名函数
函 数 | 描 述 |
ROW_NUMBER | 在结果集中为每行返回递增整数 |
RANK | 和ROW_NUMBER相似,RANK为结果集中的每行递增值。主要的区别是如果行有重复值,它们会有相同的排名值 |
DENSE_RANK | DENSE_RANK和RANK几乎一样,只是DENSE_RANK不在排名值中返回间隔 |
NTILE | NTILE根据排序和可选的分区把结果集划分成指定数量的分组 |
下面4个技巧会演示这4个排名函数的使用。
8.7.1 使用递增行号
SQL Server 2005新的ROW_NUMBER在结果集中为每行返回递增的整数。ROW_NUMBER的语法如下:
第一个可选参数partition_by_clause允许你为分区列中的每个改变重置行号。第二个参数order_by_clause指定ROW_NUMBER应用到结果集的次序。
第一个示例返回结果集中间的6行,根据名字排序:
|
这个查询返回:
可选的partition_by_clause允许为分区列的每次修改重置行号。在这个示例中,结果根据Shelf来分区并且根据ProductID排序:
在返回的结果中,行号根据ProductID递增,但是每一次Shelf变化后,行号都会从1开始:
解析
在第一个示例中,我们使用ROW_NUMBER来根据产品名排列结果并且为每行增加递增值。在子查询的第三列中引用了ROW_NUMBER:
括号中的ORDER BY子句根据产品名对结果排序,它影响行返回的次序以及和每行关联的行号。结果集中的每一行都会有一个号码,每行都会加1。由于查询根据Name排列结果,第一个产品Adjustable Race的行号会是“1”。把这个查询作为子查询,这样ROW_NUMBER列就能在外部查询的WHERE子句中被引用,返回从255到260的行。
第二个查询演示了使用partition_by_clause参数。对于Shelf的每一次改变,行号都会从“1”开始。
有了SQL Server 2005的ROW_NUMBER函数,我们现在就可以不用像SQL Server 2000那样创建其他代码实现数据分页了(例如,显示25到50行)。
8.7.2 根据排名返回行
在这个技巧中,我会演示SQL Server 2005新的RANK函数,它和ROW_NUMBER相似,也为集合中的每一行增加值。RANK的语法如下:
主要的区别是如果行有相同的值存在,那么他们会获取相同的排名值,如本例演示的那样:
这个查询返回:
和ROW_NUMBER一样,OVER子句包含可选的partition_by_clause和必需的order_by_clause。order_ by_clause决定RANK值应用到每行的顺序,可选的partition_by_clause用于进一步划分排序分组,如下例:
这个查询根据销售人员的TerritoryID进行分区并返回SalesQuota的排名:
解析
RANK根据排序的列增加它的值,和ROWNUMBER的增加每行值不同,RANK会为排序值一致的行返回相同的值。
例如,在这个技巧中,查询指定了根据SalesQuota降序排序的RANK。由于两个SalesQuota值都等于280 000.00,它们都得到了排名7:
你也注意到了,下面的SalesQuota值排名是9(而不是8)。RANK函数没有使用第8个位置是因为两行是并列第七,那么下一个排名值是9。如果3行并列,那么下一个排名值是10,依此类推:
在第二个示例中,RANK根据TerritoryID分区,对于TerritoryID的每一次修改RANK值都会从“1”开始。
8.7.3 根据无间隔排名返回行
在这个技巧中,我会演示SQL Server 2005新的DENSE_RANK,它几乎和RANK一样,只是DENSE_RANK不返回有间隔的排名值:
这个查询返回:
解析
它的语法和使用与RANK相同,只是DENSE_RANK不在排名值中创建间隔。在这个技巧的示例中,由于两个SalesQuota是280 000.00,所以两个排名都是第7:
在7之后的DENSE_RANK值为8。
<SCRIPT type=text/javascript><!--google_ad_client = "pub-0660578626274101";/* 300x250, 创建于 07-12-13 */google_ad_slot = "5846816625";google_ad_width = 300;google_ad_height = 250;//--></SCRIPT><SCRIPT type=text/javascript src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </SCRIPT><SCRIPT>window.google_render_ad();</SCRIPT><IFRAME height=250 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-0660578626274101&dt=1228318542529&lmt=1225671027&output=html&slotname=5846816625&correlator=1228318542529&url=http%3A%2F%2Fwww.zxbc.cn%2Fhtml%2F20080620%2F57483_3.html&eid=30143001&ea=0&ref=http%3A%2F%2Fwww.zxbc.cn%2Fhtml%2F20080620%2F57483_2.html&frm=0&ga_vid=1150624982.1228318543&ga_sid=1228318543&ga_hid=1075319836&flash=10.0.12.36&u_h=800&u_w=1280&u_ah=769&u_aw=1280&u_cd=32&u_tz=480&u_his=2&u_java=true&dtd=15" frameBorder=0 width=300 allowTransparency name=google_ads_frame marginWidth=0 scrolling=no></IFRAME> |
NTILE根据排序和可选的分区把结果集分成指定数量的分组。语法和其他排名函数相似,只是它包含一个integer_expression:
integer_expression用于指定要将结果划分成的分组数。本例演示对Sales.SalePersonQuotaHis- tory表操作的NTILE排名函数:
这个查询返回:
解析
在这个示例中,结果集被划分成4个分组。结果根据SalesQuota排序(降序),并且指定了NTILE分组分配的次序。注意到,前面的两组1和2都有3行,而分组3和4都有2行。如果行数不能被分组数整除,那么前几个分组会比后面几个分组多一些行。否则,如果行数能被分组数整除,每一个分组会有相同数量的行。
- SQL Server 2005增加的排名函数
- SQL SERVER的排名函数
- SQL Server 排名函数
- SQL Server 排名函数
- SQL Server排名或排序的函数
- SQL Server 2005 T-SQL 学习笔记:排名函数
- SQL Server 2005/2008 排名函数 ROW_NUMBER ,RANK,DENSE_RANK 比较
- SQL 2005 - 排名函数
- SQL Server 2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较
- MS SQL Server:排名函数详解
- sql server一些排名函数用法
- Sql Server 2005 约束(constraint)的增加
- 自动增加的存储过程函数(SQL Server)
- sql 2005 分页,排名函数
- 增加排名列SQL语句(需排名的列值相等时排名相同)
- sql server 实现排名
- SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER
- sql server 排名函数 row_number,rank,dense_rank和ntile
- c# tabindex 顺序
- GNU GCC查找路径
- C# SortedList类介绍
- MATLAB中如何选择Legend中的选择项
- FTP 文件上传
- SQL Server 2005增加的排名函数
- 游标(Cursor)管理
- FTP 文件上传
- http 请求错误码,网站上的error-page可以web.xml中定义
- 强行删除文件夹
- 子程序和程序包
- java调用Oracle存储过程
- Nginx的浏览器/服务器双向SSL证书认证配置
- bboss cms系统安装步骤