RANK (Transact-SQL)

Restituisce il rango di ogni riga all'interno della partizione di un set di risultati. Il valore di rango di una riga è uno più il numero di ranghi che precedono la riga in questione.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

RANK ( )    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 RANK. Per la sintassi PARTITION BY, vedere Clausola OVER (Transact-SQL).

  • < order_by_clause >
    Determina l'ordine in cui i valori RANK vengono applicati 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

Se due o più righe hanno un valore equivalente per un rango, ogni riga equivalente riceve lo stesso rango. Ad esempio, se due venditori principali hanno lo stesso valore SalesYTD, viene assegnato a entrambi il rango uno. Al venditore con il valore SalesYTD più alto successivo viene assegnato il rango tre, poiché sono presenti due righe di rango più elevato. Pertanto, la funzione RANK non restituirà sempre valori integer consecutivi.

L'ordinamento utilizzato per l'intera query determina l'ordinamento in base al quale vengono visualizzate le righe in un set di risultati,

Esempi

Nell'esempio seguente vengono assegnati i ranghi per i prodotti nell'inventario in base alle loro qualità. Il set di righe viene partizionato in base a LocationID e ordinato in base a Quantity. Si noti che ORDER BY nella clausola OVER ordina RANK e che ORDER BY dell'istruzione SELECT ordina il set di risultati.

USE AdventureWorks;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER 
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'RANK'
FROM Production.ProductInventory i 
    INNER JOIN Production.Product p 
        ON i.ProductID = p.ProductID
ORDER BY p.Name;
GO