語法:
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)。
例子
一、以下示例將根據年初至今的銷售額,返回 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;
三、實現分頁存儲過程(固定到某個表的數據)
?
SET
?
ANSI_NULLS
?
ON
GO
SET
?
QUOTED_IDENTIFIER
?
ON
GO
-- =============================================
-- Author:????? cxw
-- Create date: 2006/11/14
-- Description:
?
利用
Row_Number
函數實現分頁存儲過程
?
-- exec DividePageForROW_NUMBER 2,1,'',''
?
-- =============================================
Create
?
PROCEDURE
?
DividePageForROW_NUMBER
?
@iPageSize?????
?
int
????????
?
--
每頁數
,
@iIndexPage???
?
int
????????
?
--
第幾頁
,
@vOrderBy?????
?
varchar
(
50
)
?
--
排序字段
,
@iRowCount????
?
int
????????
?
--
總記錄數
?
AS
BEGIN
SET
?
NOCOUNT
?
ON
;
with
?
PageTable
?
as
(
select
?
row_number
()
?
over
(
order
?
by
?
ReasonID
)
?
TID
,*
?
from
?
A
)
select
?
*
from
?
PageTable
where
?
TID
?
between
?
((
@iIndexPage
-
1
)*
@iPageSize
+
1
)
?
and
?
@iPageSize
*
@iIndexPage
?
SET
?
NOCOUNT
?
OFF
;
?
END
GO