摘要:应用SqlServer2005开发也已经有一段时间了,但是很多时候都是把SqlServer2005当做SqlServer2000来用,因此很多SqlServer2005的新特性我都没有用到,有一个原因就是要兼容SqlServer2000的用户。新特性出来的当然就要用于实际当中,要想知道SQLServer2005的新特性可以参看微软网站的What's New in SQL Server 2005? ,特性有很多本篇文章主要介绍的是在数据库中返回特定顺序的记录集。

数据库模型:

    在我们深入Sql排序语句时,我们先来看看数据库模型,也就是我们要建立一个数据库并通过这个数据库来进行我们的讲解。我们建立一个产品数据库,首先我们要建立一个产品表Products,包含ProductID(主键),Name,Price三个字段.这是一个很简单的数据库,下面我们就运用这个数据库来讲解以下排序。

    SQLServer2005提供我们四个排序函数:ROW_NUMBER, RANK, DENSE_RANKNTILE,(据我了解)这四个函数在SqlServer2000中是没有的,在不同的场合我们可以选用这四个函数,他们各有各的特点,下面我们就逐个来看一下他们各个的特性。

ROW_NUMBER():

    这个函数是通过对特定列来排序的,也就是说我们要指定按哪个列来排序。我们要知道他的特性当然首先我们要知道他的语法:

     ROW_NUMBER() OVER([partition] order-by-clause)

    先看例子,例如我们要从产品Products中的每一个产品按价格的高低排列出来,并得到每一个产品所在的序列号,代码如下:

SELECT [ProductID][Name][Price]
       ROW_NUMBER() 
OVER(ORDER BY [Price] DESCAS Rank
FROM Products

 

 

    则在返回的结果中将会出现Rank列,此列将从1开始逐行加1(1,2,3,…),这样我们就可以很灵活的应用这个功能来分页提取记录。下面我们来看看怎样来实现快速分页,假设我们每页显示的记录数位@PageSize,当前页面为@PageIndex,我们就可以用如下代码来进行分页:

SELECT TOP(@PageSize[ProductID],[Name],[Price]
  
FROM
  (
SELECT [ProductID],[Name],[Price], ROW_NUMBER() OVER(ORDER BY [Price] DESCAS Rank 
FROM Products
  ) 
AS p
  
WHERE Rank BETWEEN ((@PageIndex -1)*@PageSize +1AND @PageSize*@PageIndex

RANK(), DENSE_RANK():

   从上面的例子中我们知道了ROW_NUMBER()函数可以返回按一定列排列的行号。但是在两个相同记录中,例如我们的产品甲和乙的价格都为1RMB,在ROW_NUMBER()中将返回甲乙的顺序为#1,#2。但是有时候我们需要的是相同的记录返回相同的行号,如上面所说的将返回的行号为(甲) #1(乙)#1,这样我们就需要用到这里所要讲述的两个函数RANK()和DENSE_RANK()函数。用法和ROW_NUMBER的用法一样:

SELECT [ProductID][Name][Price]
       RANK() 
OVER(ORDER BY [Price] DESCAS Rank
FROM Products

 我们可以知道RANK()和DENSE_RANK()都能达到效果,而不同的是,RANK()将跳过相同的记录数的行号。也就是说虽然行号相同,但是下页个不同列值的行号将是这几个行号之和加上他们的行号。如上述的甲乙为#1,用RANK()者返回丙的结果为#3,而DENSE_RANK()返回丙的结果为#2。

NTILE():

  当我们需要将给过分组排序时就要用到NTILE(),例如我们将所有的产品按照价格的高低从大到小分为5组,我们就可以用如下代码:

    SELECT ProductID, Name, Price, NTILE(5OVER (ORDER BY Price DESCas p
    FROM Produts

  这样将所有记录分成5份,按价格高低有1到5分开。

总结:

    本文讲述的四个函数ROW_NUMBER, RANK, DENSE_RANKNTILE都能够排序返回记录集,我想用的最多的就是应用ROW_NUMBER进行快速分页。其实他们四个各有各的特点,在我们平时的应用中灵活应用他们能够给我们带来很多的便利,很多的快乐!同时也希望这篇文章能够给大家带来点帮助,带来一点快乐!