ROW_NUMBER (Transact-SQL)
Data aggiornamento: 17 luglio 2006
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.
Convenzioni 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 informazioni sulla sintassi di 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
[!NOTA] La clausola
ORDER BY
nella clausolaOVER
produce l'ordinamento diROW_NUMBER
. Se si aggiunge una clausolaORDER BY
all'istruzioneSELECT
che esegue l'ordinamento in base a una o più colonne diverse da'Row Number'
, il set di risultati verrà ordinato in base alla clausolaORDER BY
esterna.
Nell'esempio seguente viene restituito il valore di ROW_NUMBER
per i venditori in AdventureWorks
in base alle vendite relative all'anno in corso.
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;
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;
Nell'esempio seguente viene illustrato l'utilizzo dell'argomento 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;
Cronologia modifiche
Versione | Cronologia |
---|---|
17 luglio 2006 |
|
Vedere anche
Riferimento
RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
Funzioni di rango (Transact-SQL)
Funzioni (Transact-SQL)