1. WHAT IS WINDOW FUNCTION??
IT IS...
- 서로 다른 행의 비교나 연산을 위해 만든 함수이다. 성능 좋다.
- GROUP BY 를 쓰지 않고 그룹 연산 가능!!! -> 데이터가 축소되지 않는다.
- LAG, LEAD, SUM, AVG, MIN, MAX, COUNT, RANK
2. GRAMMER
SELECT 윈도우함수([대상]) OVER ([PARTITION BY 컬럼] => 그룹연산 수행할 GROUP BY 컬럼
[ORDER BY 컬럼 ASC|DESC] => 어떤 순서로..?! RANK 의 경우 필수적이다. SUM, AVG, MIN, MAX, COUNT 등은 누적값 출력시 사용한다.
[ROWS|RANGE BETWEEN A AND B]) => 연산범위 설정, 이거 쓸 때 ORDER BY 절 필수!!
- PARTION BY, ORDER BY, ROWS|RANGE ... 순서 꼭 지켜야한다.
3. WHY NEED?!
전체를 출력하는 컬럼과 그룹함수 결과는 함께 출력할 수 없기 때문에!
(집계함수와 다른 열을 함께 사용할 때는 GROUP BY 절을 사용해야한다)
ex> SELECT EMPNO, ENAME, SAL, DEPTNO, SUM(SAL) FROM EMP; 오류난다.
4. EXAMPLE
ex1> 각 직원 정보와 함께 급여 총합 출력
ERROR SELECT EMPNO, ENAME, SAL, DEPTNO, SUM(SAL) FROM EMP;
SOLUTION1 서브쿼리 사용
SELECT EMPNO, ENAME, SAL, DEPTNO, (SELECT SUM(SAL) FROM EMP) AS TOTAL FROM EMP;
SOLUTION2 윈도우 함수 사용
SELECT EMPNO, ENAME, SAL, DEPTNO, SUM(SAL) OVER() AS TOTAL FROM EMP;
ex2> 각 직원 정보와 해당 직원이 속한 부서의 평균 급여 출력
SELECT EMPNO, ENAME, SAL, DEPTNO, AVG(SAL) OVER(PARTITION BY DEPTNO) AS AVG_SAL FROM EMP;
ex3> 각 직원 정보와 해당 직원이 속한 부서의 최대급여 출력
SELECT EMPNO, ENAME, SAL, DEPTNO, MAX(SAL) OVER(PARTITION BY DEPTNO) AS MAX_SAL FROM EMP;
댓글