私人资料库
本博客大部分技术文章,均从网络搜索得来,旨在收集整理技术资料,文章版权归属原作者,由此引起的任何版权问题,与本人无关。
【转自】http://blog.csdn.net/panys/archive/2007/11/12/1880589.aspx

 

下面介绍一个SQL Server 2005 中的新东东:

ROW_NUMBER
返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

语法:
ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

备注:
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数:
<partition_by_clause>
将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
<order_by_clause>
确定将 ROW_NUMBER 值分配给分区中的行的顺序。

返回类型:
bigint

示例:

SELECT * INTO #T
  
FROM(
      
SELECT 2 F1, 'AA' F2, '101' F3 UNION ALL
      
SELECT 1 F1, 'AA' F2, '102' F3 UNION ALL
      
SELECT 4 F1, 'BB' F2, '103' F3 UNION ALL
      
SELECT 5 F1, 'CC' F2, '104' F3 UNION ALL
      
SELECT 3 F1, 'AA' F2, '105' F3 UNION ALL
      
SELECT 7 F1, 'BB' F2, '106' F3 UNION ALL
      
SELECT 6 F1, 'CC' F2, '107' F3 UNION ALL
       
SELECT 5 F1, 'CC' F2, '108' F3 
  ) T1

--1
SELECT row_number() OVER (ORDER BY F1 ASCAS F1Order, * FROM #T 
--先按照F1顺序,再加上顺序号F1Order,结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
1                    1           AA   102
2                    2           AA   101
3                    3           AA   105
4                    4           BB   103
5                    5           CC   104
6                    5           CC   108
7                    6           CC   107
8                    7           BB   106

--2
SELECT row_number() OVER (ORDER BY F1 DESCAS F1Order, * FROM #T 
--先按照F1倒序,再加上顺序号F1Order,结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
1                    7           BB   106
2                    6           CC   107
3                    5           CC   108
4                    5           CC   104
5                    4           BB   103
6                    3           AA   105
7                    2           AA   101
8                    1           AA   102

--3
SELECT row_number() OVER (ORDER BY F1 ASCAS F1Order, * FROM #T ORDER BY F1 ASC
--先按照F1顺序,再加上顺序号F1Order,再把结果按F1顺序显示,结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
1                    1           AA   102
2                    2           AA   101
3                    3           AA   105
4                    4           BB   103
5                    5           CC   104
6                    5           CC   108
7                    6           CC   107
8                    7           BB   106

--4
SELECT row_number() OVER (ORDER BY F1 ASCAS F1Order, * FROM #T ORDER BY F1 DESC
--先按照F1顺序,再加上顺序号F1Order,再把结果按地F1倒序显示,注意顺序号F1Order也倒过来了,保持位置相对不变,结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
8                    7           BB   106
7                    6           CC   107
5                    5           CC   104
6                    5           CC   108
4                    4           BB   103
3                    3           AA   105
2                    2           AA   101
1                    1           AA   102

--5
SELECT row_number() OVER (ORDER BY F1 DESCAS F1Order, * FROM #T ORDER BY F1 ASC
--先按照F1倒序,再加上顺序号F1Order,再把结果按地F1顺序显示,注意顺序号F1Order也倒过来了,保持位置相对不变,结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
8                    1           AA   102
7                    2           AA   101
6                    3           AA   105
5                    4           BB   103
3                    5           CC   108
4                    5           CC   104
2                    6           CC   107
1                    7           BB   106

--6
SELECT row_number() OVER (ORDER BY F1 DESCAS F1Order, * FROM #T ORDER BY F1 DESC
--先按照F1倒序,再加上顺序号F1Order,再把结果按地F1倒序显示,结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
1                    7           BB   106
2                    6           CC   107
3                    5           CC   108
4                    5           CC   104
5                    4           BB   103
6                    3           AA   105
7                    2           AA   101
8                    1           AA   102

--7
SELECT row_number() OVER (PARTITION BY F2 ORDER BY F1 ASCAS F1Order, * FROM #T
--先按照F2分组,再按F1顺序,再加上顺序号F1Order,是分组加哦。结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
1                    1           AA   102
2                    2           AA   101
3                    3           AA   105
1                    4           BB   103
2                    7           BB   106
1                    5           CC   104
2                    5           CC   108
3                    6           CC   107

--8
SELECT row_number() OVER (PARTITION BY F2 ORDER BY F1 DESCAS F1Order, * FROM #T
--先按照F2分组,再按F1倒序,再加上顺序号F1Order,是分组加哦。结果如下:
F1Order              F1          F2   F3
-------------------- ----------- ---- ----
1                    3           AA   105
2                    2           AA   101
3                    1           AA   102
1                    7           BB   106
2                    4           BB   103
1                    6           CC   107
2                    5           CC   108
3                    5           CC   104

 

最后,可以利用row_number(),可以进行自定义分页,Top 3是每页记录数,pageIndex就是我们需要数据的页数。是不是很简单?

DECLARE @PageIndex INT
SELECT @PageIndex = 1 
SELECT TOP 3 * FROM
(
  
SELECT row_number() OVER (ORDER BY F1 ASCAS F1Order, * FROM #T 
) A 
WHERE F1Order > (@PageIndex * 3)


-------------------------------------------------------------------------------------------

 

【转】 Microsoft SQL Server 2005 查询分页


微软新的SQL Server 2005新增了数据库分页功能,以后再也用写复杂不灵活而低效率的分页存储过程。
新的数据库分页功能的核心是一个叫row_number的函数
具体如下:

返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

语法
 
ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )
 

备注
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数
<partition_by_clause>

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。

有关详细信息,请参阅 OVER 子句 (Transact-SQL)。

返回类型
bigint

示例
以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。

 复制代码
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
 

以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。

 复制代码
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60; 

==============================
进过我对百万行数据记录的分页测试,效率比以前网上能够找到的最好的存储过程(个人意见)稍高。
但是还是比同样的Oralce的分页效率低。



凡是有该标志的文章,都是该blog博主Caoer(草儿)原创,凡是索引、收藏
、转载请注明来处和原文作者。非常感谢。

 

posted on 2009-01-06 16:38  该显示名称已被其他用户使用  阅读(710)  评论(0编辑  收藏  举报