적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
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 가 비결정적입니다. 자세한 내용은 결정적 함수 및 비결정적 함수를 참조하세요.
윈도우 함수 성능 튜닝 지침은 OVER() 성능 고려사항을 참조하세요.
예제
이 문서의 코드 샘플은 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
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