SELECT 윈도우함수([대상]) OVER ([PARTITION BY 컬럼]
[ORDER BY 컬럼 ASC|DESC]
[ROWS|RANGE BETWEEN A AND B]
SELECT SUM(대상) OVER ([PARTITION BY 컬럼]
[ORDER BY 컬럼 ASC|DESC]
[ROWS|RANGE BETWEEN A AND B]
// 에러
// 각 직원 정보와 급여 총 합(그룹함수 결과)을 동시에 출력 시도
SELECT EMPNO, ENAME, SAL, DEPTNO, SUM(SAL) FROM EMP;
//해결 1 : 서브쿼리 사용
SELECT EMPNO, ENAME, SAL, DEPTNO, (SELECT SUM(SAL) FROM EMP) AS TOTAL
FROM EMP
// 해결 2 : 윈도우 함수 사용
SELECT EMPNO, ENAME, SAL, DEPTNO, SUM(SAL) OVER() AS TOTAL
FROM EMP;
// 각 직원 정보와 해당 직원이 속한 부서의 평균 급여 출력
SELECT EMPNO, ENAME, SAL, DEPTNO,
AVG(SAL) OVER(PARTITION BY DEPTNO) AS AVG_SAL
FROM EMP;
// 각 직원 정보와 해당 직원이 속한 부서의 최대급여를 함께 출력
SELECT EMPNO, ENAME, SAL, DEPTNO,
MAX(SAL) OVER(PARTITION BY DEPTNO) AS 부서별급여총합
FROM EMP;
윈도우 함수의 연산 범위
집계 연산 시 행의 범위 설정 가능
- ROWS, RANGE 차이
- ROWS : 값이 같더라도 각 행씩 연산
- RANGE : 같은 값의 경우 하나의 RANGE로 묶어서 동시 연산
// RANGE_TEST 테이블에서의 범위 설정에 따른 누적합 // 1. RANGE 범위 전달 (default) // 값이 같을 경우 같은 범위로 취급하여 동시 연산 SELECT R.*, SUM(SAL) OVER(ORDER BY SAL) FROM RANGE_TEST R;
// 2. ROWS 범위 설정 시 // 각 행 별로 연산 수행 SELECT R.*, SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RESULT1 FROM RANGE_TEST R;![]()
- BETWEEN A AND B
- 시작점 정의
CURRENT ROW : 현재행부터
UNBOUNDED PRECEDING : 처음부터 (default)
N PRECEDING : N 이전부터- 마지막 시점 정의
CURRENT ROW : 현재행까지 (default)
UNBOUNDED FOLLOWING : 마지막까지
N FOLLOWING : N 이후까지// 3. BETWEEN A AND B 수정 시 // UNBOUNDED PRECEDING AND 1 FOLLOWING // 각 행마다 누적합 계산 시 처음부터 다음 행까지 연산 SELECT R.*, SUM(SAL) OVER(ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING) AS RESULT3 FROM RANGE_TEST R;![]()
SELECT RANK(값) WITHIN GROUP(ORDER BY 컬럼);
// EMP에서 급여가 3000이면 전체 급여 순위가 열마?
SELECT RANK(3000) WITHIN GROUP(ORDER BY SAL DESC) AS RANK_VALUE
FROM EMP;
SELECT RANK() OVER([PARTITION BY 컬럼] ORDER BY 컬럼 ASC|DESC);
// 각 직원 급여의 전체 순위 (큰 순서대로)
SELECT ENAME, DEPTNO, SAL,
RANK() OVER(ORDER BY SAL DESC) AS RANK_VALUE1
FROM EMP;

SELECT LAG(컬럼, N)
OVER([PARTITION BY 컬럼]
ORDER BY 컬럼 ASC|DESC);
// EMP에서 바로 이전 입사자와 급여 비교
SELECT ENAME, HIREDATE, SAL
LAG(SAL) OVER(ORDER BY HIREDATE) AS 바로직전상사급여
FROM EMP;
SELECT ENAME, DEPTNO, SAL,
FIRST_VALUE(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL) AS MIN_VALUE,
FIRST_VALUE(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS MAX_VALUE
FROM EMP;
SELECT NTILE(N) OVER([PARTITION BY 컬럼]
ORDER BY 컬럼 ASC|DESC
// NTILE을 사용한 그룹 분리
SELECT ENAME, SAL, DEPTNO,
NTILE(2) OVER (ORDER BY SAL) AS GROUP_NUMBER
FROM EMP;
RATIO_TO_REPORT(대상) OVER([PARTITION BY ...])
CUME_DIST() OVER([PARTITION BY 컬럼] ORDER BY 컬럼)
PERCENT_RANK() OVER([PARTITION BY ...] ORDER BY ...])

홍쌤의 데이터랩
SQLD 2과목 PART2. SQL 활용 완벽 정리 (2024년 신유형 반영) 강의에 대해
공부 및 개인적으로 정리한 글 입니다.