적용 대상:SQL 서버
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
분석 플랫폼 시스템(PDW)
Microsoft Fabric의 SQL 데이터베이스
정렬된 파티션의 행을 지정된 수의 그룹으로 분산시킵니다. 그룹에는 1부터 시작하는 번호가 매겨집니다. 각 행에 대해 행 NTILE 이 속한 그룹의 수를 반환합니다.
구문
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] <order_by_clause> )
인수
integer_expression
각 파티션을 분할해야 하는 그룹 수를 지정하는 양의 정수 식입니다. integer_expression은 int 또는 bigint 형식일 수 있습니다.
<partition_by_clause>
FROM 절에 의해 생성된 결과 집합 과 JOIN, APPLY, PIVOT 절을 함수가 적용되는 파티션으로 나눕니다. 구문은 PARTITION BYSELECT - OVER 절을 참조하세요.
<order_by_clause>
파티션의 행에 NTILE 값이 할당되는 순서를 결정합니다. order_by_clause 순위 함수에 사용되는 경우 <> 정수는 열을 나타낼 수 없습니다.
반환 형식
bigint
설명
파티션의 행 수가 integer_expression 구분되지 않으면 한 멤버가 다른 두 크기의 그룹이 발생합니다. 더 큰 그룹은 절에 지정된 OVER 순서대로 더 작은 그룹 앞에 옵니다. 예를 들어 총 행 수가 53이고 그룹 수가 5인 경우 처음 세 그룹에는 11개의 행이 있고 나머지 두 그룹에는 각각 10개의 행이 있습니다. 반면에 총 행 수가 그룹 수로 나눌 수 있는 경우 행은 그룹 간에 균등하게 분산됩니다. 예를 들어 총 행 수가 50개이고 그룹이 5개인 경우 각 버킷에는 10개의 행이 포함됩니다.
NTILE 가 비결정적입니다. 자세한 내용은 결정적 함수 및 비결정적 함수를 참조하세요.
예제
이 문서의 코드 샘플은 AdventureWorks2025 홈페이지에서 다운로드할 수 있는 데이터베이스 또는 AdventureWorksDW2025 샘플 데이터베이스를 사용합니다.
비고
다음 예제에서는 CONVERT 함수를 사용하여 데이터의 형식을 SalesYTD 통화로 지정합니다.
A. 행을 그룹으로 나누기
다음 예에서는 연간 누계 매출을 기준으로 행을 네 개의 직원 그룹으로 나눕니다. 총 행 수는 그룹 수로 나눌 수 없으므로 처음 두 그룹에는 4개의 행이 있고 나머지 그룹에는 각각 3개의 행이 있습니다.
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
결과 집합은 다음과 같습니다.
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. PARTITION BY를 사용하여 결과 집합 나누기
다음 예에서는 예 1의 코드에 PARTITION BY 인수를 추가합니다. 행은 먼저 PostalCode로 분할된 다음 각 PostalCode 내에 4개 그룹으로 나누어집니다. 또한 이 예에서는 변수 @NTILE_Var을 선언하고 이 변수를 사용하여 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
결과 집합은 다음과 같습니다.
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
예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)
C. 행을 그룹으로 나누기
다음 예제에서는 이 함수를 사용하여 NTILE 영업 사원 집합을 2003년의 할당된 판매 할당량에 따라 4개의 그룹으로 나눕니다. 총 행 수는 그룹 수로 나눌 수 없으므로 첫 번째 그룹에는 5개의 행이 있고 나머지 그룹에는 각각 4개의 행이 있습니다.
-- 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;
결과 집합은 다음과 같습니다.
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. PARTITION BY를 사용하여 결과 집합 나누기
다음 예제에서는 예제 A의 PARTITION BY 코드에 인수를 추가합니다. 행은 먼저 분할된 SalesTerritoryCountry 다음 각 SalesTerritoryCountry그룹 내에서 두 그룹으로 나뉩니다.
ORDER BY 절에서 OVER 명령문과 명령문의 순서 NTILE 가 ORDER BYSELECT 결과 집합을 정렬합니다.
-- 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;
결과 집합은 다음과 같습니다.
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