NTILE (Transact-SQL)

Distribuisce le righe di una partizione ordinata in un numero specificato di gruppi. I gruppi sono numerati a partire da 1. Per ogni riga, NTILE restituisce il numero del gruppo a cui appartiene la riga.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

NTILE (integer_expression)    OVER ( [ <partition_by_clause> ] < order_by_clause > )

Argomenti

  • integer_expression
    Espressione di costante integer positiva che specifica il numero di gruppi in cui suddividere ogni partizione. integer_expression può essere di tipo int o bigint.

    [!NOTA]

    integer_expression può fare riferimento solo alle colonne della clausola PARTITION BY. integer_expression non può fare riferimento alle colonne elencate nella clausola FROM corrente.

  • <partition_by_clause>
    Divide il set dei risultati generato dalla clausola FROM in più partizioni a cui viene applicata la funzione RANK. Per la sintassi PARTITION BY, vedere Clausola OVER (Transact-SQL).

  • < order_by_clause >
    Determina l'ordine di assegnazione dei valori NTILE 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 il numero di righe in una partizione non è divisibile per integer_expression, verranno creati gruppi di due dimensioni che differiscono per un membro. I gruppi più grandi precedono i gruppi più piccoli nell'ordine specificato dalla clausola OVER. Se ad esempio il numero totale di righe è 53 e il numero di gruppi è 5, i primi 3 gruppi includeranno 11 righe e i 2 gruppi rimanenti 10 righe ognuno. Se invece il numero totale delle righe è divisibile per il numero di gruppi, le righe verranno distribuite uniformemente tra di essi. Se ad esempio il numero totale di righe è 50 e sono disponibili 5 gruppi, ogni gruppo conterrà 10 righe.

Esempi

A. Divisione di righe in gruppi

Nell'esempio seguente le righe vengono divise in quattro gruppi. Poiché il numero totale di righe non è divisibile per il numero di gruppi, il primo gruppo conterrà 4 righe e gli altri 3 righe ognuno.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS 'Quartile'
    ,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;
GO

B. Divisione del set di risultati tramite PARTITION BY

Nell'esempio seguente viene aggiunto l'argomento PARTITION BY al codice dell'esempio A. Le righe vengono prima partizionate in base a PostalCode e quindi divise in quattro gruppi in ogni PostalCode. Si noti che ORDER BY nella clausola OVER ordina NTILE e che ORDER BY dell'istruzione SELECT ordina il set di risultati.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,NTILE(4) OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Quartile'
    ,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
ORDER BY LastName;
GO