Condividi tramite


NTILE (Transact-SQL)

Si applica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema di Piattaforma Analitica (PDW)Database SQL in Microsoft Fabric

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

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

integer_expression

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

<partition_by_clause>

Divide il set di risultati prodotto dalla clausola FROM più JOIN, APPLY, clausola PIVOT in partizioni a cui viene applicata la funzione. Per la PARTITION BY sintassi, vedere clausola SELECT - OVER.

<order_by_clause>

Determina l'ordine in cui i NTILE valori vengono assegnati alle righe di una partizione. Un numero intero non può rappresentare una colonna quando il <order_by_clause> viene usato in una funzione di classificazione.

Tipi restituiti

bigint

Osservazioni:

Se il numero di righe in una partizione non è divisibile per integer_expression, questo causa gruppi di due dimensioni che differiscono per un membro. I gruppi più grandi vengono prima dei gruppi più piccoli nell'ordine specificato dalla OVER clausola . Ad esempio, se il numero totale di righe è 53 e il numero di gruppi è cinque, i primi tre gruppi hanno 11 righe e i due gruppi rimanenti hanno 10 righe ognuna. Se invece il numero totale di righe è divisibile per il numero di gruppi, le righe vengono distribuite uniformemente tra i gruppi. Ad esempio, se il numero totale di righe è 50 e sono presenti cinque gruppi, ogni bucket contiene 10 righe.

NTILE è non deterministico. Per altre informazioni, vedere Funzioni deterministiche e non deterministiche.

Esempi

Gli esempi di codice in questo articolo usano il AdventureWorks2025 database di esempio o AdventureWorksDW2025 , che è possibile scaricare dalla home page degli esempi di Microsoft SQL Server e dei progetti della community .

Annotazioni

Negli esempi seguenti la funzione CONVERT viene usata per formattare i SalesYTD dati come valuta.

R. Dividere le righe in gruppi

Nell'esempio seguente vengono divise le righe in quattro gruppi di dipendenti in base alle relative vendite da inizio anno. Poiché il numero totale di righe non è divisibile per il numero di gruppi, i primi due gruppi hanno quattro righe e i gruppi rimanenti hanno tre righe ognuna.

USE AdventureWorks2022;
GO

SELECT p.FirstName,
       p.LastName,
       NTILE(4) OVER (ORDER BY SalesYTD DESC) AS Quartile,
       CONVERT (NVARCHAR (20), s.SalesYTD, 1) AS SalesYTD,
       a.PostalCode
FROM Sales.SalesPerson AS s
     INNER JOIN Person.Person AS p
         ON s.BusinessEntityID = p.BusinessEntityID
     INNER JOIN Person.Address AS a
         ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
      AND SalesYTD <> 0;
GO

Il set di risultati è il seguente.

FirstName      LastName              Quartile  SalesYTD       PostalCode
-------------  --------------------- --------- -------------- ----------
Linda          Mitchell              1         4,251,368.55   98027
Jae            Pak                   1         4,116,871.23   98055
Michael        Blythe                1         3,763,178.18   98027
Jillian        Carson                1         3,189,418.37   98027
Ranjit         Varkey Chudukatil     2         3,121,616.32   98055
José           Saraiva               2         2,604,540.72   98055
Shu            Ito                   2         2,458,535.62   98055
Tsvi           Reiter                2         2,315,185.61   98027
Rachel         Valdez                3         1,827,066.71   98055
Tete           Mensa-Annan           3         1,576,562.20   98055
David          Campbell              3         1,573,012.94   98055
Garrett        Vargas                4         1,453,719.47   98027
Lynn           Tsoflias              4         1,421,810.92   98055
Pamela         Ansman-Wolfe          4         1,352,577.13   98027

B. Dividere il set di risultati usando 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. Nell'esempio viene anche dichiarata una variabile @NTILE_Var che viene usata per specificare il valore del parametro integer_expression.

USE AdventureWorks2022;
GO

DECLARE @NTILE_Var AS INT = 4;

SELECT p.FirstName,
       p.LastName,
       NTILE(@NTILE_Var) OVER (PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS Quartile,
       CONVERT (NVARCHAR (20), s.SalesYTD, 1) AS SalesYTD,
       a.PostalCode
FROM Sales.SalesPerson AS s
     INNER JOIN Person.Person AS p
         ON s.BusinessEntityID = p.BusinessEntityID
     INNER JOIN Person.Address AS a
         ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
      AND SalesYTD <> 0;
GO

Il set di risultati è il seguente.

FirstName    LastName             Quartile SalesYTD      PostalCode
------------ -------------------- -------- ------------  ----------
Linda        Mitchell             1        4,251,368.55  98027
Michael      Blythe               1        3,763,178.18  98027
Jillian      Carson               2        3,189,418.37  98027
Tsvi         Reiter               2        2,315,185.61  98027
Garrett      Vargas               3        1,453,719.47  98027
Pamela       Ansman-Wolfe         4        1,352,577.13  98027
Jae          Pak                  1        4,116,871.23  98055
Ranjit       Varkey Chudukatil    1        3,121,616.32  98055
José         Saraiva              2        2,604,540.72  98055
Shu          Ito                  2        2,458,535.62  98055
Rachel       Valdez               3        1,827,066.71  98055
Tete         Mensa-Annan          3        1,576,562.20  98055
David        Campbell             4        1,573,012.94  98055
Lynn         Tsoflias             4        1,421,810.92  98055

Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)

C. Dividere le righe in gruppi

Nell'esempio seguente viene usata la NTILE funzione per dividere un set di venditori in quattro gruppi in base alla quota di vendita assegnata per l'anno 2003. Poiché il numero totale di righe non è divisibile per il numero di gruppi, il primo gruppo ha cinque righe e i gruppi rimanenti hanno quattro righe ognuna.

-- Uses AdventureWorks
SELECT e.LastName,
       NTILE(4) OVER (ORDER BY SUM(SalesAmountQuota) DESC) AS Quartile,
       CONVERT (VARCHAR (13), SUM(SalesAmountQuota), 1) AS SalesQuota
FROM dbo.DimEmployee AS e
     INNER JOIN dbo.FactSalesQuota AS sq
         ON e.EmployeeKey = sq.EmployeeKey
WHERE sq.CalendarYear = 2003
      AND SalesTerritoryKey IS NOT NULL
      AND SalesAmountQuota <> 0
GROUP BY e.LastName
ORDER BY Quartile, e.LastName;

Il set di risultati è il seguente.

LastName          Quartile SalesYTD
----------------- -------- ------------
Blythe            1        4,716,000.00
Carson            1        4,350,000.00
Mitchell          1        4,682,000.00
Pak               1        5,142,000.00
Varkey Chudukatil 1        2,940,000.00
Ito               2        2,644,000.00
Saraiva           2        2,293,000.00
Vargas            2        1,617,000.00
Ansman-Wolfe      3        1,183,000.00
Campbell          3        1,438,000.00
Mensa-Annan       3        1,481,000.00
Valdez            3        1,294,000.00
Abbas             4          172,000.00
Albert            4          651,000.00
Jiang             4          544,000.00
Tsoflias          4          867,000.00

D. Dividere il set di risultati usando PARTITION BY

Nell'esempio seguente viene aggiunto l'argomento al codice nell'esempio PARTITION BY A. Le righe vengono prima partizionate per SalesTerritoryCountry e quindi suddivise in due gruppi all'interno di ogni SalesTerritoryCountry. La ORDER BY classe nella OVER clausola ordina e NTILE l'oggetto ORDER BY dell'istruzione SELECT ordina il set di risultati.

-- Uses AdventureWorks
SELECT e.LastName,
       NTILE(2) OVER (PARTITION BY e.SalesTerritoryKey ORDER BY SUM(SalesAmountQuota) DESC) AS Quartile,
       CONVERT (VARCHAR (13), SUM(SalesAmountQuota), 1) AS SalesQuota,
       st.SalesTerritoryCountry
FROM dbo.DimEmployee AS e
     INNER JOIN dbo.FactSalesQuota AS sq
         ON e.EmployeeKey = sq.EmployeeKey
     INNER JOIN dbo.DimSalesTerritory AS st
         ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE sq.CalendarYear = 2003
GROUP BY e.LastName, e.SalesTerritoryKey, st.SalesTerritoryCountry
ORDER BY st.SalesTerritoryCountry, Quartile;

Il set di risultati è il seguente.

LastName          Quartile SalesYTD       SalesTerritoryCountry
----------------- -------- -------------- ------------------
Tsoflias          1           867,000.00   Australia
Saraiva           1         2,293,000.00   Canada
Varkey Chudukatil 1         2,940,000.00   France
Valdez            1         1,294,000.00   Germany
Alberts           1           651,000.00   NA
Jiang             1           544,000.00   NA
Pak               1         5,142,000.00   United Kingdom
Mensa-Annan       1         1,481,000.00   United States
Campbell          1         1,438,000.00   United States
Reiter            1         2,768,000.00   United States
Blythe            1         4,716,000.00   United States
Carson            1         4,350,000.00   United States
Mitchell          1         4,682,000.00   United States
Vargas            2         1,617,000.00   Canada
Abbas             2           172,000.00   NA
Ito               2         2,644,000.00   United States
Ansman-Wolfe      2         1,183,000.00   United States