본문 바로가기
Database

오라클 SQL NTILE OVER 함수: 특정 컬럼을 기준으로 등급 부여 및 그룹 묶기

by 굿센스굿 2025. 3. 31.
반응형

1. NTILE 함수란?

오라클 SQL에서 NTILE 함수는 특정 컬럼의 값을 기준으로 데이터를 N개의 등급으로 나누는 윈도우 함수입니다. 주어진 데이터를 오름차순 또는 내림차순으로 정렬한 후, 균등한 그룹으로 나누어 각 행에 등급을 부여하는 방식입니다.

1.1 NTILE 함수 사용 사례

다음과 같은 경우에 NTILE 함수를 사용할 수 있습니다:

  • 직원들의 급여를 기준으로 10개 등급으로 나누기
  • 학생들의 점수를 5개 등급으로 분류하기
  • 특정한 집단별 등급 나누기
  • 특정 값에 따른 레코드 그룹 묶기

이처럼 오름차순 또는 내림차순으로 데이터를 분류해야 할 때 NTILE OVER를 활용하면 유용합니다.

2. NTILE 함수의 기본 구문

2.1 기본 사용법 (오름차순 정렬)

특정 컬럼(K)을 기준으로 N개의 등급으로 나누려면 다음과 같이 사용합니다:

SELECT 컬럼X, 컬럼Y, ...,
       NTILE(숫자N) OVER (ORDER BY 컬럼K) AS 등급
FROM 테이블A;
  • NTILE(숫자N): 데이터를 N개의 등급으로 나눕니다.
  • ORDER BY 컬럼K: 등급을 나누는 기준이 되는 컬럼을 지정합니다.
  • 등급은 오름차순으로 부여됩니다. 즉, 가장 작은 값이 1등급이 되고, 가장 큰 값이 N등급이 됩니다.

2.2 그룹별 등급 부여 (내림차순 정렬)

특정 그룹(컬럼L) 내에서 컬럼K를 기준으로 내림차순 정렬 후, N개 등급으로 나누는 방법은 다음과 같습니다:

SELECT 컬럼X, 컬럼Y, ...,
       NTILE(숫자N) OVER (PARTITION BY 컬럼L ORDER BY 컬럼K DESC) AS 등급
FROM 테이블A
WHERE 조건;
  • PARTITION BY 컬럼L: 컬럼L을 기준으로 데이터를 그룹화합니다.
  • ORDER BY 컬럼K DESC: 컬럼K를 기준으로 내림차순 정렬합니다.
  • 내림차순 정렬 시, 가장 큰 값이 1등급이고 작은 값이 N등급이 됩니다.

2.3 특정 등급만 조회

특정 등급(M)만 조회하고 싶다면 서브쿼리를 활용해야 합니다:

SELECT * FROM (
    SELECT 컬럼X, 컬럼Y, ...,
           NTILE(숫자N) OVER (PARTITION BY 컬럼L ORDER BY 컬럼K DESC) AS 등급
    FROM 테이블A
    WHERE 조건
)
WHERE 등급 = 숫자M;

3. NTILE 함수 실습 예제

아래 예제에서는 hr 스키마의 employees 테이블을 사용하여 NTILE 함수의 실제 적용 사례를 살펴봅니다.

3.1 급여 기준 10등급으로 나누기 (오름차순)

사원들의 급여(salary)를 기준으로 10등급으로 나누고자 합니다:

SELECT employee_id, first_name, salary, job_id,
       NTILE(10) OVER (ORDER BY salary) AS ntile_10
FROM employees;
  • salary가 가장 낮은 사원부터 1등급을 부여하고, 높은 사원일수록 등급이 증가합니다.
  • 전체 107개의 레코드를 10개의 그룹으로 분류합니다.

3.2 특정 직급 내 급여 기준 3등급으로 나누기 (내림차순)

job_id가 IT_PROG인 사원들만 급여 기준으로 3등급으로 나누려면 다음과 같이 작성합니다:

SELECT employee_id, first_name, salary, job_id,
       NTILE(3) OVER (PARTITION BY job_id ORDER BY salary DESC) AS ntile_3
FROM employees
WHERE job_id = 'IT_PROG';
  • PARTITION BY job_id: 동일한 job_id 내에서 급여 기준 등급을 부여합니다.
  • ORDER BY salary DESC: 급여가 높은 순서대로 1등급을 부여합니다.

3.3 모든 직급별 급여 기준 5등급으로 나누기

전체 사원들을 직책(job_id)별로 5등급으로 나누는 SQL문입니다:

SELECT employee_id, first_name, salary, job_id,
       NTILE(5) OVER (PARTITION BY job_id ORDER BY salary DESC) AS ntile_5
FROM employees
ORDER BY job_id, salary;
  • 모든 직책별(job_id)로 급여(salary)를 내림차순 정렬한 후, 5개의 등급을 부여합니다.

3.4 특정 등급만 조회하기 (1등급 사원만)

위 예제(3.3)에서 1등급 사원만 조회하려면 서브쿼리를 사용합니다:

SELECT * FROM (
    SELECT employee_id, first_name, salary, job_id,
           NTILE(5) OVER (PARTITION BY job_id ORDER BY salary DESC) AS ntile_5
    FROM employees
    ORDER BY job_id, salary
)
WHERE ntile_5 = 1;
  • WHERE ntile_5 = 1: 각 직책별로 1등급으로 분류된 사원만 조회합니다.

4. 정리

NTILE OVER 함수는 데이터를 N개의 그룹으로 분류하는 데 매우 유용한 윈도우 함수입니다. 특히, 급여와 같은 연속형 데이터를 분석할 때 등급을 부여하거나 특정 그룹 내에서 등급을 나눌 때 활용됩니다.

핵심 요약

  • NTILE(N) OVER (ORDER BY 컬럼): 전체 데이터를 N개 등급으로 나눔
  • PARTITION BY 컬럼L: 특정 그룹 내에서 등급 부여
  • ORDER BY 컬럼K DESC: 내림차순 정렬하여 등급 부여
  • 서브쿼리를 활용하여 특정 등급만 필터링 가능

이제 NTILE 함수를 활용하여 다양한 데이터 그룹화 및 분석 작업을 수행해 보세요!

반응형