안녕하세요.
오늘은 SQL 대표적인 그룹 분석함수 NTILE에 대해 간단한 예제를 통해 알아보겠습니다.

SQL NTILE 개념 및 예제
▣ NTILE 함수란?
행 데이터를 그룹별로 나누어 차례대로 행 번호를 부여하는 SQL의 분석함수
- 전체 행 데이터 수(N)를 그룹(G)으로 나누었을 때 나머지가 존재하면 첫 번째 그룹부터 나머지가 안남을 때까지 1씩 부여함.
(Ex. N=20, G= 3이면 3번 그룹까지 각 6개의 행을 부여하고 1,2번 그룹에 1행씩 추가 부여)
: Syntax
SELECT NTILE([나눌 그룹의 정수]) OVER (PARTITION BY [col1] ORDER BY [col2])
- PARTITION BY를 생략하면 전체 행(N)에 대해서 그룹화가 수행되고 PARTITION BY를 지정하면 해당 파티션(컬럼) 내에서 그룹화를 진행하여 행 번호를 부여함.
▣ NTILE 예제
: 예시 데이터 emp
| empno | ename | job | sal |
| 7902 | FORD | ANALYST | 3000 |
| 7788 | SCOTT | ANALYST | 3000 |
| 7369 | SMITH | CLERK | 800 |
| 7900 | JAMES | CLERK | 950 |
| 7876 | ADAMS | CLERK | 1100 |
| 7934 | MILLER | CLERK | 1300 |
| 7782 | CLARK | MANAGER | 2450 |
| 7698 | BLAKE | MANAGER | 2850 |
| 7566 | JONES | MANAGER | 2975 |
| 7839 | KING | PRESIDENT | 5000 |
| 7654 | MARTIN | SALESMAN | 1250 |
| 7521 | WARD | SALESMAN | 1250 |
| 7844 | TURNER | SALESMAN | 1500 |
| 7499 | ALLEN | SALESMAN | 1600 |
1) 전체 데이터에 대해서 4개의 그룹(NG)으로 행 번호 부여하기
- PARTITION BY를 생략하여 전체 데이터에 대한 그룹화를 진행하고 1~2번 그룹에 하나의 번호 추가 부여
select empno, ename, sal, NTILE(4) over (order by sal desc) as NG
from emp;
: 결과 (NG 포함)
| empno | ename | sal | NG |
| 7839 | KING | 5000 | 1 |
| 7902 | FORD | 3000 | 1 |
| 7788 | SCOTT | 3000 | 1 |
| 7566 | JONES | 2975 | 1 |
| 7698 | BLAKE | 2850 | 2 |
| 7782 | CLARK | 2450 | 2 |
| 7499 | ALLEN | 1600 | 2 |
| 7844 | TURNER | 1500 | 2 |
| 7934 | MILLER | 1300 | 3 |
| 7654 | MARTIN | 1250 | 3 |
| 7521 | WARD | 1250 | 3 |
| 7876 | ADAMS | 1100 | 4 |
| 7900 | JAMES | 950 | 4 |
| 7369 | SMITH | 800 | 4 |
2) 전체 행 그룹화를 수행하고 job 별로 그룹화하여 번호 부여하기
- PARTITION BY job을 통하여 job별로 2개로 그룹화 진행
select empno, ename, job, sal, NTILE(2) over (partition by job order by sal desc) as JNG
from emp;
: 결과
| empno | ename | job | sal | JNG |
| 7902 | FORD | ANALYST | 3000 | 1 |
| 7788 | SCOTT | ANALYST | 3000 | 2 |
| 7934 | MILLER | CLERK | 1300 | 1 |
| 7876 | ADAMS | CLERK | 1100 | 1 |
| 7900 | JAMES | CLERK | 950 | 2 |
| 7369 | SMITH | CLERK | 800 | 2 |
| 7566 | JONES | MANAGER | 2975 | 1 |
| 7698 | BLAKE | MANAGER | 2850 | 1 |
| 7782 | CLARK | MANAGER | 2450 | 2 |
| 7839 | KING | PRESIDENT | 5000 | 1 |
| 7499 | ALLEN | SALESMAN | 1600 | 1 |
| 7844 | TURNER | SALESMAN | 1500 | 1 |
| 7654 | MARTIN | SALESMAN | 1250 | 2 |
| 7521 | WARD | SALESMAN | 1250 | 2 |
반응형
'Programming > SQL' 카테고리의 다른 글
| [SQL] 다중 행 연산자 ALL & ANY (3) | 2023.06.30 |
|---|---|
| [SQL] VIEW 쿼리 내용 확인하기 (4) | 2023.06.29 |
| [SQL] 교집합 & 차집합 (INTERSECT, MINUS) (1) | 2023.02.17 |
| [MySQL] 3개 이상 테이블 LEFT JOIN (6) | 2023.02.12 |
| [MySQL] 기간 조회하기 (between) (0) | 2023.02.05 |
댓글