yeznable

[ 쿼리 ] Advanced SQL for Data Professionals (8) - NTILE 본문

하는 일/데이터엔지니어링

[ 쿼리 ] Advanced SQL for Data Professionals (8) - NTILE

yeznable 2024. 12. 9. 12:02
728x90

이 포스트는 Medium에 올라온 다음 아티클을 참고하여 정리한 글입니다.

 

Advanced SQL for Data Professionals

To start working with data, it is important to learn tools like SQL. Structured Query Language (SQL) is a programming language used for…

medium.com


이번 포스트에서 정리할 Advanced SQL 케이스는 NTILE 이다.

 

NTILE도 윈도우 함수로 데이터셋을 입력된 숫자 만큼의 그룹으로 나누어 최대한 같은 수의 데이터가 분배되도록 해서 정렬 순서대로 그룹에 지정되도록 하는 기능을 한다.

WITH Employees  (EmployeeID, Name, Salary) AS (
SELECT 1, 'John', 5000 
UNION ALL SELECT  2, 'Jane', 7000
UNION ALL SELECT  3, 'Bob', 4500
UNION ALL SELECT  4, 'Alice', 9000
UNION ALL SELECT  5, 'Mike', 12000
UNION ALL SELECT  6, 'Sara', 8000
UNION ALL SELECT  7, 'Tom', 6000
UNION ALL SELECT  8, 'Lucy', 5500
UNION ALL SELECT  9, 'Mary', 5820
UNION ALL SELECT  10, 'Tom', 7890
)

SELECT EmployeeID, Name, Salary,
    NTILE(10) OVER (ORDER BY Salary) AS SalaryQuartile
FROM Employees
;

 

Medium 아티클에서 예시로 적혀있는 쿼리의 경우는 10개의 데이터가 있는 데이터셋에 NTILE(10)을 활용해 오름차순 랭킹을 구현했다고 볼 수 있다.

그 결과는 오른쪽과 같다.

 

NTILE로 랭킹을 매기고 싶다면 데이터 수와 NTILE 함수에 넘기는 파라미터 숫자를 동일하게 사용하면 된다는 걸 알았다.

같은 데이터를 연봉 상위 그룹과 하위 그룹으로 나누고자 한다면 다음과 같이 사용하면 될 것이다.

WITH Employees  (EmployeeID, Name, Salary) AS (
SELECT 1, 'John', 5000 
UNION ALL SELECT  2, 'Jane', 7000
UNION ALL SELECT  3, 'Bob', 4500
UNION ALL SELECT  4, 'Alice', 9000
UNION ALL SELECT  5, 'Mike', 12000
UNION ALL SELECT  6, 'Sara', 8000
UNION ALL SELECT  7, 'Tom', 6000
UNION ALL SELECT  8, 'Lucy', 5500
UNION ALL SELECT  9, 'Mary', 5820
UNION ALL SELECT  10, 'Tom', 7890
)

SELECT EmployeeID, Name, Salary,
    NTILE(2) OVER (ORDER BY Salary DESC) AS SalaryQuartile
FROM Employees
;

 

NTILE에 넘겨주는 파라미터를 10에서 2로 바꾸고 Salary 정렬 기준을 DESC로 변경했다.

SalaryQuartile 필드의 값이 1인 그룹은 연봉 상위 그룹이고 2인 그룹은 하위 그룹이 된다.

정렬 기준을 오름차순으로 두고 2가 상위 그룹, 1이 하위 그룹으로 둬도 될 것 같다.

 

 


정렬 기준에 맞춰 정해준 그룹 수 대로 등급을 나눠주는 NTILE 함수에 대해 알아봤다.

 

다음 포스트에서는 MERGE INTO 내용을 정리한다.

728x90