ROW_NUMBER (Transact-SQL)

Retourne le numéro séquentiel d'une ligne d'une partition d'un ensemble de résultats, en commençant à 1 pour la première ligne de chaque partition.

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

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

Arguments

  • <partition_by_clause>
    Subdivise l'ensemble de résultats généré par la clause FROM en partitions auxquelles la fonction ROW_NUMBER est appliquée. Pour connaître la syntaxe de PARTITION BY, consultez Clause OVER (Transact-SQL).

  • <order_by_clause>
    Détermine l'ordre dans lequel la valeur ROW_NUMBER est affectée aux lignes d'une partition. Pour plus d'informations, consultez Clause ORDER BY (Transact-SQL). Un entier ne peut pas représenter une colonne lorsque <order_by_clause> est utilisé dans une fonction de classement.

Types de retour

bigint

Notes

La clause ORDER BY détermine la séquence dans laquelle les lignes d'une partition spécifique reçoivent leur valeur ROW_NUMBER unique.

Exemples

A. Retour du nombre de lignes pour les vendeurs

L'exemple suivant retourne le ROW_NUMBER des vendeurs de AdventureWorks en fonction des ventes de l'année.

SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode 

FROM Sales.vSalesPerson

WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

B. Retour d'un sous-ensemble de lignes

L'exemple suivant retourne les lignes dont le numéro est compris entre 50 et 60 inclus, dans l'ordre de 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;

C. Utilisation de Using ROW_NUMBER() avec PARTITION

L'exemple suivant illustre l'utilisation de la fonction ROW_NUMBER avec l'argument PARTITION BY.

SELECT FirstName, LastName, ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode 
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;