1.4. 윈도우 함수
윈도우 함수란
- - 분석함수 중에서 윈도우절(WINDOWNING 절)을 사용하는 함수를 윈도우 함수라고 한다.
- - 윈도우절을 사용하면 PARTITION BY 절에 명시된 그룹을 좀 더 세부적으로 그룹핑 할 수 있다.
- - 윈도우절은 분석함수중에서 일부(AVG, COUNT, SUM, MAX, MIN)만 사용 할 수 있다.
WINDOWNING 절 Syntax
윈도우 함수 OVER (
PARTITION
BY
절
ORDER
BY
절 [
ASC
|
DESC
]
ROWS
| RANGE
BETWEEN
UNBOUNDED PRECEDING | n PRECEDING |
CURRENT
ROW
AND
UNBOUNDED FOLLOWING | n FOLLOWING |
CURRENT
ROW
- - ROWS : 물리적인 ROW 단위로 행 집합을 지정한다.
- - RANGE : 논리적인 상대번지로 행 집합을 지정한다.
- - BETWEEN ~ AND 절 : 윈도우의 시작과 끝 위치를 지정한다.
- - UNBOUNDED PRECEDING : PARTITION의 첫 번째 로우에서 윈도우가 시작한다.
- - UNBOUNDED FOLLOWING : PARTITION의 마지막 로우에서 윈도우가 시작한다.
- - CURRENT ROW : 윈도우의 시작이나 끝 위치가 현재 로우 이다.
WINDOWING 절 예제
ROWS 사용 예제1
아래는 부서별(PARTITION BY deptno)로 이전 ROW(ROWS 1 PRECEDING)의 급여와 현재 ROW의 급여 합계를 출력하는 예제이다
SELECT
empno, ename, deptno, sal,
SUM
(sal) OVER (PARTITION
BY
deptno
ORDER
BY
empno
ROWS
1 PRECEDING ) pre_sum
FROM
emp;
-- PRE_SUM : 이전 ROW와 현재 ROW의 급여 합계가 출력된 것을 확인 할 수 있다.
EMPNO ENAME DEPTNO SAL PRE_SUM
------ ------- ---------- ---------- ----------
7782 CLARK 10 2450 2450
7839 KING 10 5000 7450
7934 MILLER 10 1300 6300
7369 SMITH 20 800 800
7566 JONES 20 2975 3775
7788 SCOTT 20 3000 5975
7876 ADAMS 20 1100 4100
7902 FORD 20 3000 4100
7499 ALLEN 30 1600 1600
7521 WARD 30 1250 2850
7654 MARTIN 30 1250 2500
7698 BLAKE 30 2850 4100
7844 TURNER 30 1500 4350
7900 JAMES 30 950 2450
ROWS 사용 예제2
아래 예제는 첫 번째 ROW부터 마지막 ROW까지의 합과(SAL1), 첫 번째 ROW부터 현재 ROW까지의 합(SAL2) 그리고 현재 ROW부터 마지막 ROW까지의 합(SAL3)을 출력하는 예제이다.
SELECT
empno, ename, deptno, sal,
SUM
(sal) OVER(
ORDER
BY
deptno, empno
ROWS
BETWEEN
UNBOUNDED PRECEDING
AND
UNBOUNDED FOLLOWING) sal1,
SUM
(sal) OVER(
ORDER
BY
deptno, empno
ROWS
BETWEEN
UNBOUNDED PRECEDING
AND
CURRENT
ROW) sal2,
SUM
(sal) OVER(
ORDER
BY
deptno, empno
ROWS
BETWEEN
CURRENT
ROW
AND
UNBOUNDED FOLLOWING) sal3
FROM
emp;
-- SAL1 : 첫 번째 ROW부터 마지막 ROW까지의 급여 합계이다.
-- SAL2 : 첫 번째 ROW 부터 현재 ROW까지의 급여 합계이다.
-- SAL3 : 현재 ROW부터 마지막 ROW까지 급여 합계이다.
EMPNO ENAME DEPTNO SAL SAL1 SAL2 SAL3
------ ------- ---------- ---------- ---------- ---------- ----------
7782 CLARK 10 2450 29025 2450 29025
7839 KING 10 5000 29025 7450 26575
7934 MILLER 10 1300 29025 8750 21575
7369 SMITH 20 800 29025 9550 20275
7566 JONES 20 2975 29025 12525 19475
7788 SCOTT 20 3000 29025 15525 16500
7876 ADAMS 20 1100 29025 16625 13500
7902 FORD 20 3000 29025 19625 12400
7499 ALLEN 30 1600 29025 21225 9400
7521 WARD 30 1250 29025 22475 7800
7654 MARTIN 30 1250 29025 23725 6550
7698 BLAKE 30 2850 29025 26575 5300
7844 TURNER 30 1500 29025 28075 2450
7900 JAMES 30 950 29025 29025 950
RANGE 사용 예제
아래는 월별 금액 리스트를 출력하고, 직전 3개월 합계(AMT_PRE3)와 이후 3개월 합계(AMT_FOL3)를 함께 표시하는 예제이다.
아래 예제에서는 7월 데이터가 없기 때문에 직전 3개월 합계(AMT_PRE3) 8월의 경우 6월,5월 두 달치만 누적된 것을 확인 할 수 있다.
WITH
test
AS
(
SELECT
'200801'
yyyymm, 100 amt
FROM
dual
UNION
ALL
SELECT
'200802'
, 200
FROM
dual
UNION
ALL
SELECT
'200803'
, 300
FROM
dual
UNION
ALL
SELECT
'200804'
, 400
FROM
dual
UNION
ALL
SELECT
'200805'
, 500
FROM
dual
UNION
ALL
SELECT
'200806'
, 600
FROM
dual
UNION
ALL
SELECT
'200808'
, 800
FROM
dual
UNION
ALL
SELECT
'200809'
, 900
FROM
dual
UNION
ALL
SELECT
'200810'
, 100
FROM
dual
UNION
ALL
SELECT
'200811'
, 200
FROM
dual
UNION
ALL
SELECT
'200812'
, 300
FROM
dual
)
SELECT
yyyymm
, amt
,
SUM
(amt) OVER(
ORDER
BY
TO_DATE(yyyymm,
'yyyymm'
)
RANGE
BETWEEN
INTERVAL
'3'
MONTH
PRECEDING
AND
INTERVAL
'1'
MONTH
PRECEDING) amt_pre3
,
SUM
(amt) OVER(
ORDER
BY
TO_DATE(yyyymm,
'yyyymm'
)
RANGE
BETWEEN
INTERVAL
'1'
MONTH
FOLLOWING
AND
INTERVAL
'3'
MONTH
FOLLOWING) amt_fol3
FROM
test
;
-- AMT_PRE3 : 직전 3개월 합계
-- AMT_FOL3 : 이후 3개월 합계
YYYYMM AMT AMT_PRE3 AMT_FOL3
--------- ---------- ---------- ----------
200801 100 900
200802 200 100 1200
200803 300 300 1500
200804 400 600 1100
200805 500 900 1400
200806 600 1200 1700
200808 800 1100 1200
200809 900 1400 600
200810 100 1700 500
200811 200 1800 300
200812 300 1200
'Database > Oracle SQL2' 카테고리의 다른 글
2.3. Rollup 결과 행 구분 (0) | 2019.04.24 |
---|---|
2.2. Rollup 예제 (0) | 2019.04.24 |
2.1. Rollup (0) | 2019.04.24 |
1.6. KEEP, LISTAGG (0) | 2019.04.24 |
1.5. 기타 함수 (0) | 2019.04.24 |
1.3. 집계함수 (0) | 2019.04.24 |
1.2. 순위함수 (0) | 2019.04.24 |
1.1. 분석함수란? (0) | 2019.04.24 |