`
sjrhero
  • 浏览: 85899 次
  • 性别: Icon_minigender_1
  • 来自: 河南省
社区版块
存档分类
最新评论

SQL Server2005中四个排名函数

阅读更多

排名函数是SQL Server2005新加的功能。在SQL Server2005中有如下四个排名函数:

1. row_number

2. rank

3. dense_rank

4. ntile    
下面分别介绍一下这四个排名函数的功能及用法。在介绍之前假设有一个t_table表,表结构与表中的数据如图1所示:

01

 

 

 

 

 

 


             图1

其中field1字段的类型是intfield2字段的类型是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所示。

03

 

 

 

 

 

 

 

 

 

 


图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所示。

04

 

 

 

 

 

 

 

 

 

 

 

图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所示。

05

 

 

 

 

 

 

 

 

 

 

 

图5

这个查询结果除了没有序号列row_number,其他的与图4所示的查询结果完全一样。

 

二、rank

     rank函数考虑到了over子句中排序字段值相同的情况,为了更容易说明问题,在t_table表中再加一条记录,如图6所示。 

06

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图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所示。

07

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图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所示。

08 

 

 

 

 

 

 

 

 

 

 

 

 

 

图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所示。

09

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图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

以上内容来自:http://www.cnblogs.com/nokiaguy/archive/2009/02/05/1384860.html

这次主要是用了Row_Number()函数进行分页。感觉这位朋友写的不错。希望转载的注明上面这个链接。

分享到:
评论

相关推荐

    [sql server]SQL Server2005杂谈(3):四个排名函数的比较.doc

    这四个函数的主要功能是为查询结果生成一个序号,用于实现查询指定范围的记录或实现分页功能。 一、row_number 函数 row_number 函数的用途非常广泛,用于生成一个序号列。该函数的用法如下所示: select row_...

    sqlserver2005的base64加密解密函数

    在SQL Server 2005中,Base64编码是一种常用的数据编码方式,它将二进制数据转化为可打印的ASCII字符,常用于在网络上传输或存储非ASCII字符的数据。Base64编码能够确保数据在传输过程中不被篡改,因为它是通过特定...

    Sql Server2005对t-sql的增强之排名函数

    在SQL Server 2005中,T-SQL得到了显著的增强,特别是在排名函数方面。这一增强使得数据处理和分析更为高效和灵活。排名函数主要包括ROW_NUMBER、RANK、DENSE_RANK以及NTILE,它们各自有着不同的应用场景和功能。 1...

    SQL Server 2005 技术内幕四部

    这个压缩包包含四本关于SQL Server 2005的技术内幕书籍,分别聚焦于T-SQL查询、T-SQL程序设计、存储引擎以及查询、调整和优化,另外还附带了一本与.NET相关的文档,对于深入理解SQL Server 2005的各个方面有着重要的...

    sql server 2005 使用笔记之常用函数和经典sql语句

    在SQL Server 2005中,数据库管理和数据查询是其核心功能,而函数和SQL语句则是实现这些功能的重要工具。这篇笔记主要探讨的是SQL Server 2005中的常用函数以及一些经典的SQL语句,这对于数据库管理员和开发人员来说...

    sqlserver经典 2005技术内幕 中文pdf版 4本全

    这个压缩包包含四本关于SQL Server 2005技术内幕的中文PDF书籍,涵盖了从基础到高级的各个层面,是学习和掌握SQL Server 2005的宝贵资料。 首先,我们来探讨第一本书《Microsoft SQL Server 2005技术内幕:T-SQL...

    sqlserver中常用函数

    这个函数非常有用,特别是在需要基于ASCII码进行字符比较或转换时。 ##### CHAR() **CHAR()** 函数的作用是将指定的ASCII码值转换成相应的字符。如果提供的ASCII码值不在0到255之间,该函数会返回`NULL`。例如: `...

    SQLServer2005.技术内幕四部曲中文PDF

    《SQLServer2005.技术内幕四部曲中文PDF》是一套全面解析SQL Server 2005核心技术的中文教程,包含了T-SQL查询、T-SQL程序设计、存储引擎以及查询、调整和优化四个重要方面。这套书籍旨在帮助IT专业人员深入理解SQL ...

    基于sql server 2005学习sql

    在SQL Server 2005中,学习SQL首先要掌握其基本语法,包括数据查询、插入、更新和删除操作。例如,SELECT语句用于从表中检索数据,INSERT用于向表中添加新记录,UPDATE用于修改现有记录,而DELETE则用于删除记录。...

    SQL Server 2005 数据库系统开发完全手册

    Visual Studio 2005中的SQL Server Developer Tools提供了集成开发环境,便于编写T-SQL脚本和管理数据库对象。此外,还将介绍如何使用ADO.NET和其他API与SQL Server 2005进行交互。 通过阅读《SQL Server 2005 ...

    sqlserver MD5函数

    2. **MD5_F**、**MD5_FF**、**MD5_G**、**MD5_GG**、**MD5_H**、**MD5_HH**、**MD5_I**、**MD5_II**: 这些函数分别对应MD5算法中的F、FF、G、GG、H、HH、I、II四个非线性压缩函数的两个版本,用于增强算法的安全性。...

    SQL Server 2005 Beta 2 Transact-SQL 增强功能

    SQL Server 2005引入了四个新的排序函数:ROW_NUMBER、RANK、DENSE_RANK和NTILE。这些函数使得对数据的分析和排序更加灵活。例如,ROW_NUMBER为每一行分配一个唯一的整数,RANK和DENSE_RANK则根据排序条件分配排名...

    SQL Server 2005 技术内幕(4本 chm英文版)

    这本书专注于SQL Server 2005中的Transact-SQL查询语言,是数据库开发者和管理员必备的参考资料。它涵盖了T-SQL的基本语法、查询优化、子查询、联接操作、集合函数以及窗口函数等重要主题。读者可以通过学习这本书...

    SQLServer和Oracle的常用函数对比

    本文将基于给定文件信息,深入探讨和对比SQLServer与Oracle中的一些常用函数,这些函数涵盖了数学运算、数值处理、字符串操作等多个方面,对于数据库开发者和管理员而言,掌握这些函数的使用方法是提升工作效率的...

    SQL Server 2005数据库简明教程

    SQL Server 2005是微软公司推出的一款关系型数据库管理系统,它在SQL Server 2000的基础上进行了多项改进和增强,旨在提供更高效、更安全的数据存储和管理解决方案。本教程将深入探讨SQL Server 2005的核心概念、...

    SQLServer数据库游标和函数的使用(经典)

    在SQL Server中,数据库游标和函数是两个非常重要的概念,它们在数据处理和数据库操作中扮演着不可或缺的角色。游标允许我们逐行处理查询结果,而函数则提供了丰富的计算和逻辑处理能力。 首先,让我们深入理解SQL ...

    ORACLE与SQLSERVER函数异同比较

    ### ORACLE与SQLSERVER函数异同比较 在数据库领域,Oracle和SQL Server是两种非常流行的数据库管理系统。这两种系统虽然有着不同的背景和发展历程,但都提供了丰富的功能来满足各种业务需求。尤其是在函数支持方面...

    SQL Server 2005 提供了4个行号排序函数

    ### SQL Server 2005 行号排序函数详解 #### 一、引言 在数据库操作中,经常需要对查询结果进行排序处理,尤其是在实现数据分页时。SQL Server 2005 引入了一系列窗口函数,其中行号排序函数在数据排序和分页方面...

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...

    sql server 自定义函数

    SQL Server中的自定义函数是数据库开发中的重要工具,允许用户根据特定需求创建自己的函数,以扩展标准SQL的功能。本文将深入探讨SQL Server自定义函数的种类、用途、创建方法以及实际应用示例。 一、自定义函数的...

Global site tag (gtag.js) - Google Analytics