ROW_NUMBER (Transact-SQL)
Retourne le numéro séquentiel d'une ligne de partition d'un jeu de résultats, en commençant à 1 pour la première ligne de chaque partition.
Conventions de la syntaxe Transact-SQL
Syntaxe
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
Arguments
PARTITION BY value_expression
Divise le jeu de résultats généré par la clause FROM en partitions auxquelles la fonction ROW_NUMBER est appliquée. value_expression spécifie la colonne par laquelle le jeu de résultats est partitionné. Si PARTITION BY n'est pas spécifié, la fonction gère toutes les lignes du jeu de résultats de la requête en un seul groupe. Pour plus d'informations, consultez Clause OVER (Transact-SQL).order_by_clause
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. Elle est obligatoire. Pour plus d'informations, consultez Clause OVER (Transact-SQL).
Types de retour
bigint
Remarques d'ordre général
Rien ne garantit que les lignes retournées par une requête utilisant ROW_NUMBER() seront ordonnées exactement de la même manière à chaque exécution, sauf si les conditions suivantes sont vérifiées.
Les valeurs de la colonne partitionnée sont uniques.
Les valeurs des colonnes ORDER BY sont uniques.
Les combinaisons de valeurs de la colonne de partition et des colonnes ORDER BY sont uniques.
Exemples
A.Retour du nombre de lignes pour les vendeurs
L'exemple suivant calcule un numéro de ligne pour les vendeurs de Adventure Works Cycles en fonction de leur classement de ventes de l'année.
USE AdventureWorks2012;
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row,
FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
Voici l'ensemble des résultats.
Row FirstName LastName SalesYTD
--- ----------- ---------------------- -----------------
1 Linda Mitchell 4251368.54
2 Jae Pak 4116871.22
3 Michael Blythe 3763178.17
4 Jillian Carson 3189418.36
5 Ranjit Varkey Chudukatil 3121616.32
6 José Saraiva 2604540.71
7 Shu Ito 2458535.61
8 Tsvi Reiter 2315185.61
9 Rachel Valdez 1827066.71
10 Tete Mensa-Annan 1576562.19
11 David Campbell 1573012.93
12 Garrett Vargas 1453719.46
13 Lynn Tsoflias 1421810.92
14 Pamela Ansman-Wolfe 1352577.13
B.Retour d'un sous-ensemble de lignes
L'exemple suivant calcule les numéros de ligne pour toutes les lignes de la table de SalesOrderHeader dans l'ordre d'OrderDate et retourne uniquement les lignes 50 à 60 inclus.
USE AdventureWorks2012;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
FROM Sales.SalesOrderHeader
)
SELECT SalesOrderID, OrderDate, RowNumber
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
C.Utilisation de Using ROW_NUMBER() avec PARTITION
L'exemple suivant utilise l'argument PARTITION BY pour partitionner le jeu de résultats d'une requête par la colonne TerritoryName. La clause ORDER BY spécifiée dans la clause OVER classe les lignes de chaque partition par la colonne SalesYTD. La clause ORDER BY dans l'instruction SELECT détermine l'ordre du jeu de résultats de la requête entier par TerritoryName.
USE AdventureWorks2012;
GO
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;
Voici l'ensemble des résultats.
FirstName LastName TerritoryName SalesYTD Row
--------- -------------------- ------------------ ------------ ---
Lynn Tsoflias Australia 1421810.92 1
José Saraiva Canada 2604540.71 1
Garrett Vargas Canada 1453719.46 2
Jillian Carson Central 3189418.36 1
Ranjit Varkey Chudukatil France 3121616.32 1
Rachel Valdez Germany 1827066.71 1
Michael Blythe Northeast 3763178.17 1
Tete Mensa-Annan Northwest 1576562.19 1
David Campbell Northwest 1573012.93 2
Pamela Ansman-Wolfe Northwest 1352577.13 3
Tsvi Reiter Southeast 2315185.61 1
Linda Mitchell Southwest 4251368.54 1
Shu Ito Southwest 2458535.61 2
Jae Pak United Kingdom 4116871.22 1