【转】SQL Server 2005 中行号的显示,分页

【转自】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  ASC AS  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  DESC AS  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  ASC AS  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  ASC AS  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  DESC AS  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  DESC AS  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  ASC AS  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  DESC AS  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  ASC AS  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(草儿)原创,凡是索引、收藏
、转载请注明来处和原文作者。非常感谢。

 

转载于:https://www.cnblogs.com/yencain/articles/1370475.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值