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;