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.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

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 AdventureWorks 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 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. 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;