NTILE (Transact-SQL)

將排序資料分割中的資料列散發到指定數目的群組中。 這些群組從 1 開始編號。 對於每個資料列,NTILE 都會傳回資料列所屬群組的號碼。

主題連結圖示 Transact-SQL 語法慣例

語法

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

引數

  • integer_expression
    用於指定每個資料分割必須劃分之群組數的正整數常數運算式。 integer_expression 的類型可以是 int 或 bigint。

  • <partition_by_clause>
    FROM 子句所產生的結果集分成套用函數的資料分割。 如需 PARTITION BY 語法,請參閱<OVER 子句 (Transact-SQL)>。

  • <order_by_clause>
    指定 NTILE 值指派給資料分割中之資料列的順序。 在排名函數中使用 <order_by_clause> 時,整數無法表示資料行。

傳回類型

bigint

備註

如果 integer_expression 無法整除資料分割中的資料列數,兩個大小的群組會相差一個成員。 在 OVER 子句所指定的順序中,較大群組會在較小群組的前面。 例如,如果資料列總數是 53,群組數目是 5,前三個群組會有 11 個資料列,後兩個群組會有 10 個資料列。 如果群組數目可以整除資料列的總數,資料列就會平均分散在各個群組中。 例如,如果資料列總數是 50,有 5 個群組,每個值區都會包含 10 個資料列。

範例

A.將資料列分割成數個群組

在下列範例中,根據資料列的年初至今銷售,將其除以員工數群組。 由於群組數目無法整除資料列的總數,第一個群組會有四個資料列,其餘群組會有三個資料列。

USE AdventureWorks2012; 
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

以下為結果集:

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
 (14 row(s) affected)

B.使用 PARTITION BY 分割結果集

下列範例會將 PARTITION BY 引數加入範例 A 中的代碼。 資料列會先由 PostalCode 進行資料分割,然後再於每個 PostalCode 中分割成四個群組。 此範例也會宣告 @NTILE\_Var 變數,並且使用該變數來指定 integer_expression 參數的值。

USE AdventureWorks2012;
GO
DECLARE @NTILE_Var 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

以下為結果集:

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

(14 row(s) affected)

請參閱

參考

RANK (Transact-SQL)

DENSE_RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

次序函數 (Transact-SQL)

內建函數 (Transact-SQL)