Contents
1. 윈도우 함수의 개요1️⃣ 윈도우 함수의 기초 개념2️⃣ 윈도우 함수의 종류3️⃣ 윈도우 함수의 형식2. 순위 함수1️⃣ ROW_NUMBER()1) ROW_NUMBER()2️⃣ RANK()3️⃣ DENSE_RANK()3. 집계 함수1️⃣ SUM()2️⃣ AVG()3️⃣ COUNT()4️⃣ MAX()5️⃣ MIN()6️⃣ 집계 함수 + OVER4. 행 순서 관련 함수(오프셋 함수)1️⃣ LAG(n)2️⃣ LEAD(n)3️⃣ FIRST_VALUE()4️⃣ LAST_VALUE()5️⃣ NTH_VALUE(n)5. 비율 함수1️⃣ COME_DIST()2️⃣ PERCENT_RANK()3️⃣ NTILE(n)1. 윈도우 함수의 개요
1️⃣ 윈도우 함수의 기초 개념
1) 윈도우 함수
- 윈도우 : 전체 데이터 중 특정한 부분만 발췌해서 보기 때문에 마치 창문을 통해 보는 것과 비슷하다는 의미에서 유래
- 고급 레벨의 SQL기능
- 보고서 작성 및 데이터 분석 등에서 매우 많이 활용됨 (분석 함수라고도 불림)
- 전체 데이터의 행들을 파티션으로 나누어 영역을 설정하고, 그 영역 안에서 행과 행 간의 관계를 쉽게 정의하기 위해 만들어진 함수
- 데이터 분석과 집계에 강력한 도구, 데이터베이스 내의 행을 비교하고 계산하는 다양한 방식으로 사용할 수 있음 → 복잡한 분석 작업을 효율적으로 수행
2️⃣ 윈도우 함수의 종류
1) 순위 함수
함수 | 설명 |
ROW_NUMBER() | 각 파티션 내에서 고유한 순위 부여 |
RANK() | 동일 값에 같은 순위, 다음 순위 건너뜀 |
DENSE_RANK() | 동일 값에 같은 순위, 다음 순위 연속 |
2) 집계 함수
함수 | 설명 |
SUM() | 합계 계산 |
AVG() | 평균 계산 |
COUNT() | 행 수 계산 |
MAX() | 최댓값 찾기 |
MIN() | 최솟값 찾기 |
(집계 함수 + OVER) | 이동 평균, 이동 합계 등 계산 |
3) 행 순서 관련 함수(오프셋 함수)
함수 | 설명 |
LAG(n) | 현재 행에서 n만큼 이전 행 값 반환 |
LEAD(n) | 현재 행에서 n만큼 이후 행 값 반환 |
FIRST_VALUE | 윈도우의 첫 번째 행 값 반환 |
LAST_VALUE | 윈도우의 마지막 행 값 반환 |
NTH_VALUE(n) | 윈도우의 n번째 행 값 반환 |
4) 비율 함수
함수 | 설명 |
CUME_DIST() | 누적 분포 값 계산 |
PERCENT_RANK() | 백분율 순위 계산 |
NTILE(n) | 데이터를 n개 그룹으로 균등 분할 |
RATIO_TO_REPORT | 그룹 내 비율 계산 |
5) 분석 함수 ❌
⚠️ 통계 및 분석 관련 함수는 SQLD 범위 아님
3️⃣ 윈도우 함수의 형식
1) 윈도우 함수의 형식
OVER키워드가 필수로 포함
- ROWS : 물리적인 결과 행의 수 / RANGE : 논리적인 값에 의한 범위
→ 둘 중 하나 선택해서 사용
단, WINDOWING 절은 SQL Server에서는 미지원
SELECT WINDOW_FUNCTION(ARGUMENTS)
OVER ([PARTITION BY 칼럼] [ORDER 절] [WINDOWING 절])
FROM 테이블명;WINDOW_FUNCTION: 기존에 사용하던 함수도 있고, 새롭게 WINDOW 함수용으로 추가된 함수도 있음
ARGUMENTS(인수): 함수에 따라 0 ~ N개의 인수가 지정될 수 있음
PARTITION BY절 : 전체 집합을 기준에 따라 소그룹으로 나눌 수 있음
ORDER BY절 : 어떤 항목에 대해 순위를 지정하고자 할 때 ORDER BY 절을 기술
WINDOWING절 : 함수의 대상이 되는 행 기준의 범위(계산이 되는 범위)를 세밀하게 지정할 수 있음
2) 윈도우 함수의 예
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, E.SAL,
ROW_NUMBER() OVER(
PARTITION BY E.DEPTNO
ORDER BY E.SAL DESC
) AS SALARY_RANK
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;EMPNO | ENAME | DEPTNO | DNAME | SAL | SALARY_RANK |
7839 | KING | 10 | ACCOUNTING | 5000 | 1 |
7782 | CLARK | 10 | ACCOUNTING | 2450 | 2 |
7934 | MILLER | 10 | ACCOUNTING | 1300 | 3 |
7902 | FORD | 20 | RESEARCH | 3000 | 1 |
7788 | SCOTT | 20 | RESEARCH | 3000 | 2 |
7566 | JONES | 20 | RESEARCH | 2975 | 3 |
7876 | ADAMS | 20 | RESEARCH | 1100 | 4 |
7369 | SMITH | 20 | RESEARCH | 800 | 5 |
7698 | BLAKE | 30 | SALES | 2850 | 1 |
7499 | ALLEN | 30 | SALES | 1600 | 2 |
7844 | TURNER | 30 | SALES | 1500 | 3 |
7521 | WARD | 30 | SALES | 1250 | 4 |
7654 | MARTIN | 30 | SALES | 1250 | 5 |
7900 | JAMES | 30 | SALES | 950 | 6 |
2. 순위 함수
1️⃣ ROW_NUMBER()
1) ROW_NUMBER()
- SQL에서 각 행에 고유한 순위 번호를 할당하는 윈도우 함수
- 주로 데이터의 순서를 매기거나 특정 기준에 따라 행을 나열할 때 사용됨
2) ROW_NUMBER() 함수의 형식
ROW_NUMBER() OVER (PARTITION BY [파티션 기준] ORDER BY [정렬 기준])ROW_NUMBER()뒤에OVER절이 오며, 두 가지 옵션을 괄호로 묶어 사용
PARTITION BY [파티션 기준]- 행을 기준으로 구분해 나누는 옵션
- 생략 가능하며, 생략할 경우 전체 결과 집합에 대해 순위 매김
ORDER BY [정렬 기준]- 순위를 매길 때 사용할 정렬 기준
- 반드시 지정해야 함
- 지정하지 않으면 에러 발생
3) ROW_NUMBER() 함수의 예 #1
- 전체 행에 대해 급여(SAL)가 높은 순으로 순위 매기는 함수(
PARTITION BY옵션 지정 안 함)
SELECT DEPTNO, ENAME, SAL, ROW_NUMBER() OVER(
ORDER BY SAL DESC
) AS RANK
FROM EMP;DEPTNO | ENAME | SAL | RANK |
10 | KING | 5000 | 1 |
20 | FORD | 3000 | 2 |
20 | SCOTT | 3000 | 3 |
20 | JONES | 2975 | 4 |
30 | BLAKE | 2850 | 5 |
… | … | … | … |
ROW_NUMBER() 함수는 동일 순위 표시 불가 ❌)※ 타이 브레이커(tie-breaker)
ROW_NUMBER()함수는 같은 값을 가진 행들 사이의 순서를 데이터베이스 시스템에 의해 임의 결정됨
→ 동일한 ORDER BY 정렬 순서에 대해 동일한 결과의 순위 보장 못 함
→ 일관된 결과 얻기 위해 ORDER BY 절에 추가로 칼럼 지정해야 함
→ 이 때, 추가되는 칼럼을 ‘타이 브레이커(tie-breaker)’라 부름
- 형식
ROW_NUMBER() OVER (PARTITION BY [파티션 기준] ORDER BY [정렬 기준#1], [정렬 기준#2], ...)- 예시
SELECT DEPTNO, ENAME, SAL, ROW_NUMBER() OVER (
ORDER BY SAL DESC, ENAME DESC
) AS RANK
FROM EMP;DEPTNO | ENAME | SAL | RANK |
10 | KING | 5000 | 1 |
20 | SCOTT | 3000 | 2 |
20 | FORD | 3000 | 3 |
20 | JONES | 2975 | 4 |
30 | BLAKE | 2850 | 5 |
… | … | … | … |
4) ROW_NUMBER() 함수의 예 #2
- 부서별로 구분하고, 부서별로 급여(SAL)가 높은 순으로 순위를 매기는 함수
(
PARTITION BY 옵션 지정)SELECT DEPTNO, ENAME, SAL, ROW_NUMBER() OVER (
PARTITION BY DEPTNO
ORDER BY SAL DESC
) AS RANK
FROM EMP;DEPTNO | ENAME | SAL | RANK |
10 | KING | 5000 | 1 |
10 | CLARK | 2450 | 2 |
10 | MILLER | 1300 | 3 |
20 | SCOTT | 3000 | 1 |
20 | FORD | 3000 | 2 |
20 | JONES | 2975 | 3 |
20 | ADAMS | 1100 | 4 |
20 | SMITH | 800 | 5 |
30 | BLAKE | 2850 | 1 |
30 | ALLEN | 1600 | 2 |
30 | TURNER | 1500 | 3 |
30 | MARTIN | 1250 | 4 |
30 | WARD | 1250 | 5 |
30 | JAMES | 950 | 6 |
5) ROW_NUMBER() 함수의 예 #3
- 특정 부서에 대해서만 급여(SAL) 값이 높은 순으로 순위를 매기는 함수
(WHERE 절에서 특정 부서의 조건을 정의)
SELECT DEPTNO, ENAME, SAL, ROW_NUMBER() OVER (
ORDER BY SAL DESC
) AS RANK
FROM EMP
WHERE DEPTNO = 30;DEPTNO | ENAME | SAL | RANK |
30 | BLAKE | 2850 | 1 |
30 | ALLEN | 1600 | 2 |
30 | TURNER | 1500 | 3 |
30 | WARD | 1250 | 4 |
30 | MARTIN | 1250 | 5 |
30 | JAMES | 950 | 6 |
2️⃣ RANK()
1) RANK() 함수
- 동일한 값이 있을 때 동일한 순위 부여하고, 다음 순위 건너뜀
2) RANK() 함수의 형식
RANK() OVER (PARTITION BY [파티션 기준] ORDER BY [정렬 기준])3) RANK() 함수의 예시
SELECT DEPTNO, ENAME, SAL, RANK() OVER (
ORDER BY SAL DESC
) AS RANK
FROM EMP;DEPTNO | ENAME | SAL | RANK |
10 | KING | 5000 | 1 |
20 | FORD | 3000 | 2 |
20 | SCOTT | 3000 | 2 |
20 | JONES | 2975 | 4 |
30 | BLAKE | 2850 | 5 |
… | … | … | … |
3️⃣ DENSE_RANK()
1) DENSE_RANK() 함수
- 동일한 값이 있을 때 동일한 순위 부여하고, 다음 순위 건너뛰지 않고 연속된 순위를 매김
2) DENSE_RANK() 함수의 형식
DENSE_RANK() OVER (PARTITION BY [파티션 기준] ORDER BY [정렬 기준])3) DENSE_RANK() 함수의 예시
SELECT DEPTNO, ENAME, SAL, DENSE_RANK() OVER (
ORDER BY SAL DESC
) AS RANK
FROM EMP;DEPTNO | ENAME | SAL | RANK |
10 | KING | 5000 | 1 |
20 | SCOTT | 3000 | 2 |
20 | FORD | 3000 | 2 |
20 | JONES | 2975 | 3 |
30 | BLAKE | 2850 | 4 |
10 | CLARK | 2450 | 5 |
30 | ALLEN | 1600 | 6 |
30 | TURNER | 1500 | 7 |
10 | MILLER | 1300 | 8 |
30 | WARD | 1250 | 9 |
30 | MARTIN | 1250 | 9 |
20 | ADAMS | 1100 | 10 |
30 | JAMES | 950 | 11 |
20 | SMITH | 800 | 12 |
3. 집계 함수
1️⃣ SUM()
1) SUM() 함수
- 지정된 칼럼의 숫자 값들의 합계 계산
- NULL 값은 무시됨
- NULL을 0으로 처리하고 싶다면
COALESCE혹은NVL함수 사용해야 함
SUM(COALESCE(COLUMN_NAME, 0))
SUM(NVL(COLUMN_NAME,0))2) SUM() 함수의 예
SELECT DEPTNO, SUM(SAL) AS DEPT_SAL_SUM
FROM EMP
GROUP BY DEPTNO;DEPTNO | DEPT_SAL_SUM |
20 | 10875 |
30 | 9400 |
10 | 8750 |
SELECT DEPTNO, SUM(COALESCE(SAL,0)) AS DEPT_SAL_SUM
FROM EMP
GROUP BY DEPTNO;SELECT DEPTNO, SUM(NVL(SAL,0)) AS DEPT_SAL_SUM
FROM EMP
GROUP BY DEPTNO;※ COALESCE vs NVL
ㅤ | COALESCE | NVL |
호환성 | SQL 표준 | 오라클 전용 |
매개변수의 수 | 두 개 이상의 매개변수 사용 가능 | 두 개의 매개변수만 사용 가능 |
평가 방식 | NULL이 아닌 값 찾으면 그 이후의 매개변수는 평가하지 않음 | 두 번째 매개변수 항상 평가 |
성능 | 더 효율적
(특히, 여러 대체 값이 있을 때) | ㅤ |
2️⃣ AVG()
1) AVG() 함수
- SQL에서 특정 칼럼의 평균 값 계산할 때 사용
- NULL 값 무시
- NULL 값을 0으로 취급하여 평균 값 계산하고 싶다면 COALESCE 또는 NVL 함수 사용
2) AVG() 함수의 예
SELECT DEPTNO, AVG(COALESCE(COMM, 0)) AS COMM_AVG
FROM EMP
GROUP BY DEPTNO;DEPTNO | COMM_AVG |
20 | 0 |
30 | 366.6667 |
10 | 0 |
3️⃣ COUNT()
1) COUNT() 함수
- 행의 개수 계산하는 집계 함수
- NULL 값은 무시할 수 있지만, 모든 행을 포함할 수도 있음
2) COUNT() 함수의 예
COUNT(*)는 NULL을 포함
SELECT COUNT(*) AS TOTAL_SAL
FROM EMP;TOTAL_SAL |
14 |
- 특정 칼럼의
COUNT()는 기본적으로 NULL을 제외
SELECT COUNT(COMM) AS TOTAL_SAL
FROM EMP;TOTAL_SAL |
4 |
- 특정 칼럼의 NULL을 포함해서 COUNT하고 싶을 때
SELECT COUNT(COALESCE(COMM, 0)) AS TOTAL_SAL
FROM EMP;TOTAL_SAL |
14 |
4️⃣ MAX()
1) MAX() 함수
- 지정된 칼럼의 최댓값 반환
- NULL 값 무시
- 주로 수치 데이터, 날짜, 문자열 등 비교 가능한 값에 대해 적용
2) MAX() 함수의 예
SELECT DEPTNO, MAX(SAL) AS MAX_SAL
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;DEPTNO | MAX_SAL |
10 | 5000 |
20 | 3000 |
30 | 2850 |
5️⃣ MIN()
1) MIN() 함수
- 지정된 칼럼의 최솟값 반환
- NULL 값 무시
- 주로 수치 데이터, 날짜, 문자열 등 비교 가능한 값에 대해 적용
2) MIN() 함수의 예
SELECT DEPTNO, MIN(SAL) AS MIN_SAL
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;DEPTNO | MIN_SAL |
10 | 1300 |
20 | 800 |
30 | 950 |
6️⃣ 집계 함수 + OVER
1) 집계 함수 + OVER
- 집계 함수가 윈도우 함수로 작동하여 데이터의 특정 ‘윈도우’ 또는 ‘프레임’ 내에서 계산 수행
OVER절 : 집계 함수의 적용 범위 정의
2) 집계 함수 + OVER 예
SELECT EMPNO, DEPTNO, ENAME, SAL, AVG(SAL) OVER (
PARTITION BY DEPTNO
ORDER BY DEPTNO
) AS DEPT_SAL_AVG
FROM EMP;EMPNO | DEPTNO | DNAME | SAL | DEPT_SAL_AVG |
7782 | 10 | CLARK | 2450 | 2916.667 |
7839 | 10 | KING | 5000 | 2916.667 |
7934 | 10 | MILLER | 1300 | 2916.667 |
7566 | 20 | JONES | 2975 | 2175 |
7902 | 20 | FORD | 3000 | 2175 |
… | … | … | … | … |
4. 행 순서 관련 함수(오프셋 함수)
1️⃣ LAG(n)
1) LAG(n) 함수
- 주어진 행의 이전 행 값을 반환하는 윈도우 함수
- 데이터 분석과 시계열 데이터 처리에 매우 유용함
2) LAG(n) 함수의 형식
OVER절과 함께 사용되어 데이터를 파티션으로 나누고 정렬할 수 있음
LAG(칼럼명, [위치 n], [이전 행이 없을 때 반환할 값])
OVER (PARTITION BY [파티션 기준] ORDER BY [정렬 기준])3) LAG(n) 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL, LAG(SAL, 1, 0) OVER (
ORDER BY EMPNO
) AS PRE_SAL
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | PRE_SAL |
20 | 7369 | SMITH | 800 | 0 |
30 | 7499 | ALLEN | 1600 | 800 |
30 | 7521 | WARD | 1250 | 1600 |
20 | 7566 | JONES | 2975 | 1250 |
30 | 7654 | MARTIN | 1250 | 2975 |
30 | 7698 | BLAKE | 2850 | 1250 |
10 | 7782 | CLARK | 2450 | 2850 |
20 | 7788 | SCOTT | 3000 | 2450 |
10 | 7839 | KING | 5000 | 3000 |
30 | 7844 | TURNER | 1500 | 5000 |
20 | 7876 | ADAMS | 1100 | 1500 |
30 | 7900 | JAMES | 950 | 1100 |
20 | 7902 | FORD | 3000 | 950 |
10 | 7934 | MILLER | 1300 | 3000 |
2️⃣ LEAD(n)
1) LEAD(n) 함수
- 주어진 행의 이후 행 값을 반환하는 윈도우 함수
- 데이터 분석과 시계열 데이터 처리에 매우 유용함
2) LEAD(n) 함수의 형식
OVER절과 함께 사용되어 데이터를 파티션으로 나누고 정렬할 수 있음
LEAD(칼럼명, [위치 n], [이후 행이 없을 때 반환할 값])
OVER (PARTITION BY [파티션 기준] ORDER BY [정렬 기준])3) LEAD(n) 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL, LEAD(SAL, 1, 0) OVER (
ORDER BY EMPNO
) AS NEXT_SAL
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | PRE_SAL |
20 | 7369 | SMITH | 800 | 1600 |
30 | 7499 | ALLEN | 1600 | 1250 |
30 | 7521 | WARD | 1250 | 2975 |
20 | 7566 | JONES | 2975 | 1250 |
30 | 7654 | MARTIN | 1250 | 2850 |
30 | 7698 | BLAKE | 2850 | 2450 |
10 | 7782 | CLARK | 2450 | 3000 |
20 | 7788 | SCOTT | 3000 | 5000 |
10 | 7839 | KING | 5000 | 1500 |
30 | 7844 | TURNER | 1500 | 1100 |
20 | 7876 | ADAMS | 1100 | 950 |
30 | 7900 | JAMES | 950 | 3000 |
20 | 7902 | FORD | 3000 | 1300 |
10 | 7934 | MILLER | 1300 | 0 |
3️⃣ FIRST_VALUE()
1) FIRST_VALUE() 함수
- 데이터 집합 도는 파티션 내에서 첫 번째 값 반환
2) FIRST_VALUE() 함수의 형식
FIRST_VALUE(칼럼명) OVER (
PARTITION BY [파티션 기준]
ORDER BY [정렬 기준]
[WINDOW FRAME] // 데이터 범위 지정 (생략 가능)
)3) FIRST_VALUE() 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL, FIRST_VALUE(SAL) OVER (
PARTITION BY DEPTNO
ORDER BY EMPNO
) AS DEPT_FIRST_SAL
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | DEPT_FIRST_SAL |
10 | 7782 | CLARK | 2450 | 2450 |
10 | 7839 | KING | 5000 | 2450 |
10 | 7934 | MILLER | 1300 | 2450 |
20 | 7369 | SMITH | 800 | 800 |
20 | 7566 | JONES | 2975 | 800 |
20 | 7788 | SCOTT | 3000 | 800 |
… | … | … | … | … |
4️⃣ LAST_VALUE()
1) LAST_VALUE() 함수
- 데이터 집합 도는 파티션 내에서 마지막 값 반환
2) LAST_VALUE() 함수의 형식
LAST_VALUE(칼럼명) OVER (
PARTITION BY [파티션 기준]
ORDER BY [정렬 기준]
[WINDOW FRAME] // 데이터 범위 지정 (생략 가능)
)3) LAST_VALUE() 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL, LAST_VALUE(SAL) OVER (
PARTITION BY DEPTNO
ORDER BY EMPNO
) AS DEPT_LAST_SAL
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | DEPT_LAST_SAL |
10 | 7782 | CLARK | 2450 | 2450 |
10 | 7839 | KING | 5000 | 5000 |
10 | 7934 | MILLER | 1300 | 1300 |
20 | 7369 | SMITH | 800 | 800 |
20 | 7566 | JONES | 2975 | 2975 |
20 | 7788 | SCOTT | 3000 | 3000 |
… | … | … | … | … |
-
LAST_VALUE()는 기본적으로 현재 행까지만의 데이터를 고려함
- 아직 처리하지 않은 나머지 값 고려하기 위해서 범위를 명시해야 함 (➡️ 윈도우 함수의 프레임 절)
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING⬇️ 의미
ROWS // 모든 ROW에 대해
BETWEEN UNBOUNDED PRECEDING // 파티션의 첫 번째 행부터
AND UNBOUNDED FOLLOWING // 파티션의 마지막 행까지- 프레임 절 적용
SELECT DEPTNO, EMPNO, ENAME, SAL,
LAST_VALUE(SAL) OVER (
PARTITION BY DEPTNO
ORDER BY EMPNO
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS DEPT_LAST_SAL
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | DEPT_LAST_SAL |
10 | 7782 | CLARK | 2450 | 1300 |
10 | 7839 | KING | 5000 | 1300 |
10 | 7934 | MILLER | 1300 | 1300 |
20 | 7369 | SMITH | 800 | 3000 |
20 | 7566 | JONES | 2975 | 3000 |
20 | 7788 | SCOTT | 3000 | 3000 |
20 | 7876 | ADAMS | 1100 | 3000 |
20 | 7902 | FORD | 3000 | 3000 |
30 | 7499 | ALLEN | 1600 | 950 |
… | … | … | … | … |
5️⃣ NTH_VALUE(n)
1) NTH_VALUE(n) 함수
- 데이터 집합 또는 파티션 내에서 지정된 순서의 값 반환
2) NTH_VALUE(n) 함수의 형식
OVER절과 함께 사용되어 데이터를 파티션으로 나누고 정렬할 수 있음
NTH_VALUE(칼럼명, n)
OVER (
PARTITION BY [파티션 기준]
ORDER BY [정렬 기준]
[WINDOW FRAME] // 데이터 범위 지정 (생략 가능)
)3) NTH_VALUE(n) 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL,
NTH_VALUE(SAL, 2) OVER (
PARTITION BY DEPTNO
ORDER BY EMPNO
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS SECOND_SAL
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | DEPT_LAST_SAL |
10 | 7782 | CLARK | 2450 | 5000 |
10 | 7839 | KING | 5000 | 5000 |
10 | 7934 | MILLER | 1300 | 5000 |
20 | 7369 | SMITH | 800 | 2975 |
20 | 7566 | JONES | 2975 | 2975 |
20 | 7788 | SCOTT | 3000 | 2975 |
… | … | … | … | … |
5. 비율 함수
1️⃣ COME_DIST()
1) CUME_DIST() 함수
- 누적 분포 함수
- 데이터 집합 내에서 특정 값 이하의 값들이 차지하는 비율 반환
- 0과 1 사이의 값 반환
2) CUME_DIST() 함수의 형식
CUME_DIST()
OVER (
PARTITION BY [파티션 기준]
ORDER BY [정렬 기준]
)3) CUME_DIST() 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL, CUME_DIST() OVER (
PARTITION BY DEPTNO
ORDER BY SAL
) AS DEPT_CUME_DUST
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | DEPT_CUME_DUST |
10 | 7934 | MILLER | 1300 | 0.333333 |
10 | 7782 | CLARK | 2450 | 0.666667 |
10 | 7839 | KING | 5000 | 1 |
20 | 7369 | SMITH | 800 | 0.2 |
20 | 7876 | ADAMS | 1100 | 0.4 |
20 | 7566 | JONES | 2975 | 0.6 |
20 | 7788 | SCOTT | 3000 | 1 |
20 | 7902 | FORD | 3000 | 1 |
30 | 7900 | JAMES | 950 | 0.166667 |
30 | 7521 | WARD | 1250 | 0.5 |
30 | 7654 | MARTIN | 1250 | 0.5 |
30 | 7844 | TURNER | 1500 | 0.666667 |
30 | 7499 | ALLEN | 1600 | 0.833333 |
30 | 7698 | BLAKE | 2850 | 1 |
2️⃣ PERCENT_RANK()
1) PERCENT_RANK() 함수
- 데이터 집합 내에서 각 값의 백분위 순위를 계산하여, 첫 번째 행의 백분위 순위는 0으로 시작해서 0과 1 사이의 값 반환
- 각 항목의 상대적 위치를 백분율로 쉽게 표현 가능
PERCENT_RANK()= 순위 - 1 / 전체 행의 개수 - 1
CUME_DIST()와의 차이점PERCENT_RANK(): 순위 기반 / 0부터 시작CUME_DIST(): 누적 분포 기반 / 0보다 큰 값부터 시작
2) PERCENT_RANK() 함수의 형식
PERCENT_RANK()
OVER (
PARTITION BY [파티션 기준]
ORDER BY [정렬 기준]
)3) PERCENT_RANK() 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL, PERCENT_RANK() OVER (
PARTITION BY DEPTNO
ORDER BY SAL
) AS DEPT_PERCENT_RANK
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | DEPT_PERCENT_RANK |
10 | 7934 | MILLER | 1300 | 0 |
10 | 7782 | CLARK | 2450 | 0.5 |
10 | 7839 | KING | 5000 | 1 |
20 | 7369 | SMITH | 800 | 0 |
20 | 7876 | ADAMS | 1100 | 0.25 |
20 | 7566 | JONES | 2975 | 0.5 |
20 | 7788 | SCOTT | 3000 | 0.75 |
20 | 7902 | FORD | 3000 | 0.75 |
30 | 7900 | JAMES | 950 | 0 |
… | … | … | … | … |
3️⃣ NTILE(n)
1) NTILE(n) 함수
- 데이터 집합을 n개의 동일한 크기의 그룹으로 나누고, 각 행에 그룹 번호를 부여함
2) NTILE(n) 함수의 형식
NTILE(n)
OVER (
PARTITION BY [파티션 기준]
ORDER BY [정렬 기준]
)3) NTILE(n) 함수의 예
SELECT DEPTNO, EMPNO, ENAME, SAL, NTILE(3) OVER (
PARTITION BY DEPTNO
ORDER BY SAL
) AS DEPT_NTILE
FROM EMP;DEPTNO | EMPNO | ENAME | SAL | DEPT_NTILE |
10 | 7934 | MILLER | 1300 | 1 |
10 | 7782 | CLARK | 2450 | 2 |
10 | 7839 | KING | 5000 | 3 |
20 | 7369 | SMITH | 800 | 1 |
20 | 7876 | ADAMS | 1100 | 1 |
20 | 7566 | JONES | 2975 | 2 |
20 | 7788 | SCOTT | 3000 | 2 |
20 | 7902 | FORD | 3000 | 3 |
30 | 7900 | JAMES | 950 | 1 |
… | … | … | … | … |
Share article