본문 바로가기
Database/Oracle

[ORACLE] NTILE() 함수로 순위 그룹 나누기 완벽 가이드

by Papa Martino V 2025. 6. 1.
728x90

오라클 NTILE() 함수로 순위 그룹 나누기 완벽 가이드
Oracle NTILE()

 

NTILE() 함수는 Oracle SQL의 분석 함수(윈도 함수) 중 하나로, 지정한 수의 동일한 구간(타일)으로 행을 분할하는 데 사용됩니다. 데이터를 사분위수, 분위수 등으로 나누고자 할 때 매우 유용하게 사용되며, 고객 등급, 점수 구간, 판매 순위 등의 실무에서 자주 활용됩니다.

1. NTILE() 함수란?

NTILE(n) 함수는 데이터를 n개의 동일한 그룹으로 나누고 각 행이 속한 구간 번호(1 ~ n)를 반환합니다.

문법

NTILE(n) OVER (ORDER BY column_name)
  • n: 나눌 구간 수 (정수)
  • ORDER BY: 정렬 기준 칼럼 (필수)

2. NTILE() 기본 예제

SELECT employee_id, salary,
       NTILE(4) OVER (ORDER BY salary DESC) AS salary_quartile
FROM employees;

이 쿼리는 급여를 기준으로 직원들을 4등분(사분위수)하여 각 직원이 속한 급여 구간을 나타냅니다.

3. 실무 활용 예제

3.1 고객 등급 분류

SELECT customer_id, total_spent,
       NTILE(5) OVER (ORDER BY total_spent DESC) AS spending_tier
FROM customer_orders;

총지출 기준으로 고객을 5등급으로 분류할 수 있습니다.

3.2 제품 판매 순위 구간

SELECT product_id, total_sales,
       NTILE(3) OVER (ORDER BY total_sales DESC) AS sales_group
FROM product_sales;

판매량 기준으로 제품을 3등급으로 나눠 상중하 그룹을 구분합니다.

3.3 시험 점수 분위 분석

SELECT student_id, score,
       NTILE(10) OVER (ORDER BY score DESC) AS decile
FROM exam_results;

학생 점수를 기준으로 10 분위(Decile) 분석을 수행합니다.

4. NTILE()의 동작 원리

NTILE은 전체 행 수를 n으로 나누어 그룹을 만들고, ORDER BY 순서에 따라 각 행에 순차적으로 구간 번호를 부여합니다. 데이터 수가 나누어 떨어지지 않을 경우, 앞쪽 구간부터 하나씩 더 많은 행이 배정됩니다.

5. PARTITION BY와 함께 사용

SELECT department_id, employee_id, salary,
       NTILE(3) OVER (PARTITION BY department_id ORDER BY salary DESC) AS dept_group
FROM employees;

부서별 급여 순위를 기준으로 각 부서 내에서 그룹을 나눕니다.

6. NTILE() vs RANK(), DENSE_RANK() 비교

함수 용도 중복값 처리
NTILE(n) 데이터를 n개의 구간으로 나눔 동일한 값도 다른 구간으로 분배 가능
RANK() 순위 반환 동순위 존재 시 순위 건너뜀
DENSE_RANK() 중복 없는 연속 순위 반환 동순위 존재 시 순위 유지

7. 활용 팁 및 주의사항

  • 정렬 기준이 올바르게 지정되지 않으면 결과가 예측 불가능해질 수 있습니다.
  • NTILE(1)은 항상 1을 반환합니다.
  • 구간 수가 전체 행 수보다 클 경우, 일부 구간은 빈 값이 될 수 있습니다.
  • PARTITION BY를 함께 사용하면 그룹별 분할이 가능해져 더욱 세밀한 분석이 가능합니다.

8. 실무 시나리오 요약

  • 고객 충성도 분석: 지출 기준으로 고객 5등급 분류
  • 성과 평가: 점수 기준 10 분위 등급 부여
  • 매출 리포트: 매출 상위 30% 제품 식별
  • HR 분석: 부서별 연봉 등급 비교

9. 자주 묻는 질문 (FAQ)

Q. NTILE로 생성된 구간은 항상 균등한가요?

A. 균등하게 나누려고 하지만, 전체 행 수가 나눠 떨어지지 않으면 앞 구간에 1개 더 많을 수 있습니다.

Q. NTILE은 순위 함수인가요?

A. 아니요, NTILE은 순위 기반의 구간 분류 함수입니다. RANK()나 ROW_NUMBER()와는 다릅니다.

Q. NULL 값은 어떻게 처리되나요?

A. ORDER BY 시 NULL 값의 위치는 정렬 방식(ASC/DESC, NULLS FIRST/LAST)에 따라 결정됩니다.

10. 결론

NTILE() 함수는 Oracle SQL에서 데이터를 n개의 구간으로 나누어 분석하고 보고할 때 매우 유용한 도구입니다. 특히 고객 등급, 점수 분포, 제품 그룹화 등 다양한 실무에서 활용할 수 있으며, PARTITION BYORDER BY 옵션을 적절히 활용하면 더 세밀한 분석이 가능합니다.

출처

728x90