NTILE (Transact-SQL)
更新 : 2006 年 7 月 17 日
順序付けられたパーティションの行を、指定した数のグループに分散します。グループには、1 から始まる番号が付けられます。行ごとに、NTILE はその行が属しているグループの番号を返します。
構文
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )
引数
integer_expression
各パーティションを分割するグループの数を表す正の整数定数式を指定します。integer_expression には int または bigint 型を指定できます。メモ : integer_expression では PARTITION BY 句の列だけを参照できます。現在の FROM 句で示される列は参照できません。
- <partition_by_clause>
FROM 句で生成された結果セットを、RANK 関数が適用されるパーティションに分割します。PARTITION BY の構文については、「OVER 句 (Transact-SQL)」を参照してください。
- < order_by_clause >
NTILE 値がパーティション内の行に割り当てられる順序を決定します。詳細については、「ORDER BY 句 (Transact-SQL)」を参照してください。<order_by_clause> が順位付け関数で使用される場合、整数値で列を表すことはできません。
戻り値の型
bigint
解説
パーティション内の行の数が integer_expression で割り切れない場合、1 つのメンバによって異なる 2 つのサイズのグループが生成されます。OVER 句で指定される順序では、大きいグループが小さいグループよりも前になります。たとえば、行の総数が 53 でグループの数が 5 の場合、最初の 3 つのグループに 11 行が割り当てられ、残りの 2 つのグループにはそれぞれ 10 行が割り当てられます。一方、行の総数がグループの数で割り切れる場合、行はそれらのグループに均等に割り当てられます。たとえば、行の総数が 50 で、5 つのグループがある場合、各グループに 10 行ずつ割り当てられます。
例
A. 行をグループに分割する
次の例では、行を 4 つのグループに分割します。行の総数がグループの数で割り切れないため、最初のグループに 4 つの行が割り当てられ、残りのグループにはそれぞれ 3 つの行が割り当てられます。
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. PARTITION BY を使用して結果セットを分割する
次の例では、PARTITION BY
引数を例 A のコードに追加します。まず、行を PostalCode
でパーティション分割した後、それぞれの PostalCode
内で 4 つのグループに分割します。OVER
句の ORDER BY
によって NTILE
が順序付けされ、SELECT
ステートメントの ORDER BY
によって結果セットが順序付けされることに注目してください。
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
参照
関連項目
RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL)
順位付け関数 (Transact-SQL)
関数 (Transact-SQL)