ROW_NUMBER (Transact-SQL)
Restituisce il numero sequenziale di una riga all'interno di una partizione di un set di risultati, a partire da 1 per la prima riga di ogni partizione.
Sintassi
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
Argomenti
<partition_by_clause>
Suddivide il set di risultati generato dalla clausola FROM in partizioni alle quali viene applicata la funzione ROW_NUMBER. Per la sintassi PARTITION BY, vedere Clausola OVER (Transact-SQL).<order_by_clause>
Determina l'ordine in cui il valore della funzione ROW_NUMBER viene assegnato alle righe in una partizione. Per ulteriori informazioni, vedere Clausola ORDER BY (Transact-SQL). Una colonna non può essere rappresentata da un valore integer quando si utilizza <order_by_clause> in una funzione di rango.
Tipi restituiti
bigint
Osservazioni
La clausola ORDER BY determina la sequenza in base alla quale alle righe viene assegnato un valore univoco ROW_NUMBER all'interno di una partizione specificata.
Esempi
A. Restituzione del numero di riga per i venditori
Nell'esempio seguente viene restituito il valore di ROW_NUMBER per i venditori in AdventureWorks2008R2 in base alle vendite relative all'anno in corso.
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. Restituzione di un subset di righe
Nell'esempio seguente vengono restituite righe con numeri da 50 a 60 compresi nell'ordine in data OrderDate.
USE AdventureWorks2008R2;
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. Utilizzo di ROW_NUMBER() con PARTITION
Nell'esempio seguente viene illustrato l'utilizzo della funzione ROW_NUMBER con l'argomento 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;