转载自:http://www.blogjava.net/nokiaguy/archive/2009/02/05/253440.html
排名函数是
SQL Server2005新加的功能。在
SQL Server2005中有如下四个排名函数:
-
row_number
- rank
- dense_rank
- ntile
下面分别介绍一下这四个排名函数的功能及用法。在介绍之前假设有一个t_table表,表结构与表中的数据如图1所示:
图1
其中field1字段的类型是int,field2字段的类型是varchar
row_number
row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示:
select row_number() over(order by field1) as row_number,* from t_table
上面的SQL语句的查询结果如图2所示。
图2
其中row_number列是由row_number函数生成的序号列。在使用row_number函数是要使用over子句选择对某一列进行排序,然后才能生成序号。
实际上,row_number函数生成序号的基本原理是先使用over子句中的排序语句对记录进行排序,然后按着这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如下面的SQL语句所示:
select row_number() over(order by field2 desc) as row_number,* from t_table order by field1 desc
上面的
SQL语句的查询结果如图
3所示
图3
我们可以使用row_number函数来实现查询表中指定范围的记录,一般将其应用到Web应用程序的分页功能上。下面的SQL语句可以查询t_table表中第2条和第3条记录:
with t_rowtable
as
(
select row_number() over(order by field1) as row_number,* from t_table
)
select * from t_rowtable where row_number>1 and row_number < 4 order by field1
上面的SQL语句的查询结果如图4所示
图4
上面的SQL语句使用了CTE,关于CTE的介绍将读者参阅《SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL》。
另外要注意的是,如果将row_number函数用于分页处理,over子句中的order by 与排序记录的order by 应相同,否则生成的序号可能不是有续的。
当然,不使用row_number函数也可以实现查询指定范围的记录,就是比较麻烦。一般的方法是使用颠倒Top来实现,例如,查询t_table表中第2条和第3条记录,可以先查出前3条记录,然后将查询出来的这三条记录按倒序排序,再取前2条记录,最后再将查出来的这2条记录再按倒序排序,就是最终结果。SQL语句如下:
select * from (select top 2 * from( select top 3 * from t_table order by field1) a order by field1 desc) b order by field1
上面的
SQL语句查询出来的结果如图
5所示。
图5
这个查询结果除了没有序号列
row_number,其他的与图
4所示的查询结果完全一样。
rank
rank
函数考虑到了
over子句中排序字段值相同的情况,为了更容易说明问题,在
t_table表中再加一条记录,如图
6所示。
图6
在图6所示的记录中后三条记录的field1字段值是相同的。如果使用rank函数来生成序号,这3条记录的序号是相同的,而第4条记录会根据当前的记录
数生成序号,后面的记录依此类推,也就是说,在这个例子中,第4条记录的序号是4,而不是2。rank函数的使用方法与row_number函数完全相
同,SQL语句如下:
select rank() over(order by field1),* from t_table order by field1
上面的
SQL语句的查询结果如图
7所示。
图7
dense_rank
dense_rank
函数的功能与
rank函数类似,只是在生成序号时是连续的,而
rank函数生成的序号有可能不连续。如上面的例子中如果使用
dense_rank函数,第
4条记录的序号应该是
2,而不是
4。如下面的
SQL语句所示:
select dense_rank() over(order by field1),* from t_table order by field1
上面的
SQL语句的查询结果如图
8所示。
图8
读者可以比较图
7和图
8所示的查询结果有什么不同
ntile
ntile函数可以对序号进行分组处理。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。ntile函数为每条记
录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。ntile函数有一个参数,用来指定桶数。下
面的SQL语句使用ntile函数对t_table表进行了装桶处理:
select ntile(4) over(order by field1) as bucket,* from t_table
上面的
SQL语句的查询结果如图
9所示。
图9
由于t_table表的记录总数是6,而上面的SQL语句中的ntile函数指定了桶数为4。
也许有的读者会问这么一个问题,SQL Server2005怎么来决定某一桶应该放多少记录呢?可能t_table表中的记录数有些少,那么我们假设t_table表中有59条记录,而桶数是5,那么每一桶应放多少记录呢?
实际上通过两个约定就可以产生一个算法来决定哪一个桶应放多少记录,这两个约定如下:
1.编号小的桶放的记录不能小于编号大的桶。也就是说,第1捅中的记录数只能大于等于第2桶及以后的各桶中的记录。
2.所有桶中的记录要么都相同,要么从某一个记录较少的桶开始后面所有捅的记录数都与该桶的记录数相同。也就是说,如果有个桶,前三桶的记录数都是10,而第4捅的记录数是6,那么第5桶和第6桶的记录数也必须是6。
根据上面的两个约定,可以得出如下的算法:
// mod表示取余,div表示取整
if(记录总数 mod 桶数 == 0)
{
recordCount = 记录总数 div 桶数;
将每桶的记录数都设为recordCount
}
else
{
recordCount1 = 记录总数 div 桶数 + 1;
int n = 1; // n表示桶中记录数为recordCount1的最大桶数
m = recordCount1 * n;
while(((记录总数 - m) mod (桶数 - n)) != 0 )
{
n++;
m = recordCount1 * n;
}
recordCount2 = (记录总数 - m) div (桶数 - n);
将前n个桶的记录数设为recordCount1
将n + 1个至后面所有桶的记录数设为recordCount2
}
根据上面的算法,如果记录总数为
59,桶数为
5,则前
4个桶的记录数都是
12,最后一个桶的记录数是
11。
如果记录总数为
53,桶数为
5,则前
3个桶的记录数为
11,后
2个桶的记录数为
10。
就拿本例来说,记录总数为
6,桶数为
4,则会算出
recordCount1的值为
2,在结束
while循环后,会算出
recordCount2的值是
1,因此,前
2个桶的记录是
2,后
2个桶的记录是
1。
分享到:
相关推荐
在SQL Server数据库管理系统中,排序函数是不可或缺的一部分,它们用于对查询结果进行升序或降序排列,使得数据按照特定的顺序展现。本篇将详细探讨SQL Server中的排序功能及其在拼音处理和全角半角字符处理中的应用...
其次,"Microsoft SQL Server 2005技术内幕:T-SQL程序设计.pdf"会涵盖T-SQL在程序设计方面的应用,如触发器、存储过程、函数和事务管理。通过这部分内容,读者可以学习如何利用T-SQL进行业务逻辑处理,创建自定义的...
《基于SQL Server 2005学习SQL》 SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,而SQL Server 2005作为微软公司的一款强大的数据库管理系统,为开发者提供了广泛的功能和工具,使其在...
### SQL Server 2005 行号排序函数详解 #### 一、引言 在数据库操作中,经常需要对查询结果进行排序处理,尤其是在实现数据分页时。SQL Server 2005 引入了一系列窗口函数,其中行号排序函数在数据排序和分页方面...
SQL Server 2005引入了四个新的排序函数:ROW_NUMBER、RANK、DENSE_RANK和NTILE。这些函数使得对数据的分析和排序更加灵活。例如,ROW_NUMBER为每一行分配一个唯一的整数,RANK和DENSE_RANK则根据排序条件分配排名...
第二本,《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》将更进一步,教授读者如何利用T-SQL编写存储过程、触发器和用户定义函数。这些编程元素在数据库应用中极为常见,用于实现业务逻辑和数据验证。你将学...
《SQL Server 2005 技术内幕:T-SQL查询源码》是一本深入探讨SQL Server 2005中T-SQL查询技术的专业书籍。T-SQL(Transact-SQL)是Microsoft SQL Server数据库管理系统中使用的SQL扩展版本,它在标准SQL的基础上增加...
在SQL Server 2005中,函数是执行特定计算或操作的重要工具,它们极大地丰富了数据库查询和处理的能力。以下是对标题和描述中提到的一些关键函数类型的详细说明: 1. **日期和时间函数**: - `GETDATE()`:返回...
在SQL Server 2005中,数据库管理和数据查询是其核心功能,而函数和SQL语句则是实现这些功能的重要工具。这篇笔记主要探讨的是SQL Server 2005中的常用函数以及一些经典的SQL语句,这对于数据库管理员和开发人员来说...
19.SQL Server 2014返回记录排序.mp4 2.SQL Server 2014硬件和软件要求.mp4 20.SQL Server 2014关联查询.mp4 21.SQL Server 2014聚合函数AVG() SUM().mp4 22.SQL Server 2014聚合函数MIN() MAX().mp4 23.SQL ...
SQL SERVER 2005 简介 SQL Server 2005 是一个全新的数据库平台系统,包含多种软件元件与服务,来满足企业对于日渐复杂的数据系统的需求。该版本的T-SQL结构化查询语言大幅扩增了新的查询指令,例如XQuery、取得...
《SQL Server 2005技术内幕》是深入解析Microsoft SQL Server 2005查询优化与调优的专业书籍,其代码部分包含了丰富的实践示例,帮助读者理解并掌握SQL Server 2005的核心技术。以下是根据书中的章节代码文件名,...
### SQLServer中的汉字转全拼音函数 在数据库管理和数据处理领域,经常需要对文本进行各种形式的转换,以便于检索、排序或者分析等操作。其中一个常见的需求是将汉字转换为拼音,这对于支持中文环境的系统尤其重要...
《Microsoft SQL Server 2005技术内幕:T-SQL查询》是一本深入解析SQL Server 2005中T-SQL查询语言的专业书籍。T-SQL(Transact-SQL)是微软对标准SQL的扩展,是SQL Server的核心组件,用于数据库管理、数据查询和...
《Microsoft SQL Server 2005技术内幕:T-SQL查询的源代码》是一本深入探讨SQL Server 2005中T-SQL查询技术的专业书籍。T-SQL(Transact-SQL)是Microsoft SQL Server数据库管理系统中用于数据操作、查询、存储过程...
《SQL Server 2005数据库教程》是一份专为初学者设计的全面教程,旨在帮助读者快速理解和掌握SQL Server 2005的核心概念和技术。这份教程以其简单、易学、易懂的特点,深受数据库爱好者欢迎。通过深入浅出的方式,...
SQL Server 2005引入了新的数据类型、存储过程、触发器等。 3. SSMS(SQL Server Management Studio):是SQL Server的主要管理工具,用于创建、配置、管理和开发SQL Server的所有组件。 三、SQL Server 2005核心...
《SQL Server 2005 入门编程经典源代码》是针对初学者设计的一份宝贵的教育资源,由知名出版机构Wrox出品。这份资源旨在帮助新手掌握SQL Server 2005的基础编程技巧,通过实际的源代码示例来深化理解和应用。 SQL ...
在SQL Server 2005中,T-SQL得到了显著增强,其中一个重要方面是引入了新的数据类型。这些数据类型更加丰富且灵活,能够更好地支持现代应用程序的需求。例如: - **日期与时间**: SQL Server 2005引入了`DATE`, `...
SQL Server 2005是微软公司推出的一款关系型数据库管理系统,它在企业级数据管理和分析方面具有广泛的应用。此“SQL Server 2005源代码”可能包含与数据库设计、开发和管理相关的示例代码和教程。下面将详细讨论SQL ...