SELECT WINDOW_FUNCTION(ARGUMENTS)
OVER (PARTITION BY 칼럼
ORDER BY WINDOWING절)
FROM 테이블명;
| 구조 | 설명 |
|---|---|
| ARGUMENTS(인수) | 윈도우 함수에 따라서 0~N개의 인수를 설정한다. |
| PARTITION BY | 전체 집합을 기준에 의해 소그룹으로 나눈다 |
| ORDER BY | 어떤 항목에 대해서 정렬한다 |
| WINDOWING | - 행 기준 범위를 정한다 - ROWS는 물리적 결과의 행 수이고 RANGE는 논리적인 값에 의한 범위이다. |
| 구조 | 설명 |
|---|---|
| ROWS | 부분집합인 윈도우 크기를 물리적 단위로 행의 집합을 지정한다. |
| RANGE | 논리적 주소에 의해 행 집합을 지정한다. |
| BETWEEN~AND | 윈도우의 시작과 끝 위치를 지정한다. |
| UNBOUNDED PRECEDING | 윈도우 시작 위치가 첫 번째 행임을 의미한다. |
| UNBOUNDED FOLLOWING | 윈도우 마지막 위치가 마지막 행임을 의미한다. |
| CURRENT ROW | 윈도우 시작 위치가 현재 행임을 의미한다. (데이터가 인출된 현재 행을 의미한다.) |
SELECT EMPNO, ENAME, SAL
SUM(SAL) OVER(ORDER BY SAL
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING) TOTSAL
FROM EMP;
SELECT EMPNO, ENAME, SAL
SUM(SAL) OVER(ORDER BY SAL
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW)TOTSAL
FROM EMP;
| 순위 함수 | 설명 |
|---|---|
| RANK | - 특정항목 및 파티션에 대해서 순위를 계산한다. - 동일한 순위는 동일한 값이 부여된다. |
| DENSE_RANK | - 동일한 순위를 하나의 건수로 계산한다. |
| ROW_NUMBER | - 동일한 순위에 대해서 고유의 순위를 부여한다. |
SELECT ENAME, SAL
RANK() OVER (ORDER BY SAL DESC) ALL_RANK,
RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK,
FROM EMP;
RANK() OVER (ORDER BY SAL DESC)는 SAL로 등수를 계산하고, 내림차순으로 조회하게 한다.RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC)는 JOB으로 파티션을 만들고, JOB별로 SAL 순위를 조회하게 한다.SELECT ENAME, SAL,
RANK() OVER (ORDER BY SAL DESC) ALL_RANK,
DENSE_RANK() OVER(ORDER BY SAL DESC) DENSE_RANK
FROM EMP;
SELECT ENAME, SAL,
RANK() OVER (ORDER BY SAL DESC) ALL_RANK,
ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUM
FROM EMP;
| 집계 함수 | 설명 |
|---|---|
| SUM | 파티션 별로 합계를 계산한다. |
| AVG | 파티션 별로 평균을 계산한다. |
| COUNT | 파티션 별로 행 수를 계산한다. |
| MAX와 MIN | 파티션 별로 최댓값과 최솟값을 계산한다. |
SELECT ENAME, SAL
SUM(SAL) OVER (PARTITION BY MGR) SUM_MGR
FROM EMP;
| 행 순서 | 설명 |
|---|---|
| FIRST_VALUE | - 파티션에서 가장 처음에 나오는 값을 구한다. - MIN 함수를 사용해서 같은 결과를 구할 수 있다. |
| LAST_VALUE | - 파티션에서 가장 나중에 나오는 값을 구한다. |
| LAG | - 이전 행을 가지고 온다. |
| LEAD | - 윈도우에서 특정 위치의 행을 가지고 온다. - 기본값은 1이다. |
SELECT DEPTNO, ENAME, SAL,
FIRST VALUE(ENAME) OVER (PARTITION BY DEPTNO
ORDER BY SAL DESC ROS UNBOUNDED PRECEDING) AS
DEPT_A FROM EMP;
SELECT DEPTNO, ENAME, SAL
LAST_VALUE(ENAME) OVER (PARTITION BY DEPTNO
ORDER BY SAL DESC ROWS BETWEEN CURRENT ROW AND
DEPT A FROM EMP;
SELECT DEPTNO, ENAME, SAL, LEAD(SAL, 2)
OVER (ORDER BY SAL DESC) AS PRE_SAL FROM EMP
| 비율 함수 | 설명 |
|---|---|
| CUME_DIST | - 파티션 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 조회한다. - 누적 분포상에 위치를 0~1사이의 값을 가진다. |
| PERCENT_RANK | 파티션에서 제일 먼저 나온 것을 0으로 제일 늦게 나온 것을 1로 하여 값이 아닌 행의 순서별 백분율을 조회한다. |
| NTILE | 파티션 별로 전체 건수를 ARGUMENT 값으로 N등분한 결과를 조회한다. |
| RATIO_TO_REPORT | 파티션 내에 전체 SUM(칼럼)에 대한 행 별 칼럼 값의 백분율을 소수점까지 조회한다. |
SELECT DEPTNO, ENAME, SAL
PERCENT_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS PERCENT_SAL
FROM EMP;
SELECT DEPTNO, ENAME, SAL, NTILE(4)
OVER (ORDER BY SAL DESC) AS N_TILE
FROM EMP;