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.

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 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 clausola OVER produce l'ordinamento di ROW_NUMBER. Se si aggiunge una clausola ORDER BY all'istruzione SELECT che esegue l'ordinamento in base a una o più colonne diverse da 'Row Number', il set di risultati verrà ordinato in base alla clausola ORDER 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

Nuovo contenuto:
  • Aggiunta dell'esempio relativo all'argomento PARTITION BY.

Vedere anche

Riferimento

RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
Funzioni di rango (Transact-SQL)
Funzioni (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005