ROW_NUMBER (Transact-SQL)

Mis à jour : 17 juillet 2006

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.

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.

Types de retour

bigint

Exemples

ms186734.note(fr-fr,SQL.90).gifRemarque :
Le paramètre ORDER BY de la clause OVER détermine l'ordre de ROW_NUMBER. Si vous ajoutez une clause ORDER BY à l'instruction SELECT qui trie en fonction d'une autre colonne que 'Row Number', l'ensemble de résultats sera ordonné par la clause ORDER BY externe.

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

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 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

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;

L'exemple suivant illustre l'utilisation de l'argument PARTITION BY.

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

Historique des modifications

Version Historique

17 juillet 2006

Nouveau contenu :
  • Ajout d'un exemple pour l'argument PARTITION BY.

Voir aussi

Référence

RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
Fonctions de classement (Transact-SQL)
Fonctions (Transact-SQL)

Aide et Informations

Assistance sur SQL Server 2005