좋습니다! Oracle SQL의 윈도우 함수(Window Function) 는 매우 강력한 기능으로, 행(row)들을 그룹으로 묶어 집계 또는 분석을 수행하면서도 행 단위로 결과를 반환합니다. 아래에 윈도우 함수의 개념, 주요 함수 종류, 설명, 사용 예제를 함께 정리하고, 미디어위키 표 형식으로도 제공합니다.
⸻
✅ 윈도우 함수란? • 일반적인 집계 함수(SUM, AVG, COUNT, 등)는 여러 행을 하나로 집계합니다. • 윈도우 함수는 집계를 하되, 각 행마다 결과를 계산해서 반환합니다. • OVER() 절을 사용하며, PARTITION BY, ORDER BY, ROWS BETWEEN 등을 조합하여 정교한 분석이 가능합니다.
⸻
✅ 사용 구문 기본 형태
<함수명>(컬럼) OVER (
PARTITION BY ... -- 그룹핑 기준 ORDER BY ... -- 정렬 기준 ROWS BETWEEN ... -- 분석 범위
)
⸻
✅ 대표적인 윈도우 함수 목록 (미디어위키 표 형식)
함수명 | 설명 | 예제 SQL | 설명 결과 |
---|---|---|---|
ROW_NUMBER() | 파티션 내 행 번호를 순서대로 부여 |
SELECT EMP_NAME, ROW_NUMBER() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS RN FROM EMPLOYEE; || 각 부서별 급여 내림차순 순위 (중복 순위 없음) | |
RANK() | 동점자에게 같은 순위를 부여하고 다음 순위는 건너뜀 |
SELECT EMP_NAME, RANK() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS RANK FROM EMPLOYEE; || 부서 내 급여 순위 (동점자 동일 순위) | |
DENSE_RANK() | RANK와 비슷하지만 순위를 건너뛰지 않음 |
SELECT EMP_NAME, DENSE_RANK() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS DRANK FROM EMPLOYEE; || 순위에 공백 없이 채워짐 | |
LAG() | 현재 행 기준 이전 행의 값을 가져옴 |
SELECT EMP_NAME, SALARY, LAG(SALARY) OVER (ORDER BY EMP_ID) AS PREV_SAL FROM EMPLOYEE; || 이전 직원의 급여 정보 확인 | |
LEAD() | 현재 행 기준 다음 행의 값을 가져옴 |
SELECT EMP_NAME, SALARY, LEAD(SALARY) OVER (ORDER BY EMP_ID) AS NEXT_SAL FROM EMPLOYEE; || 다음 직원의 급여 정보 확인 | |
SUM(), AVG(), COUNT(), MAX(), MIN() | 집계 함수도 윈도우와 함께 사용 가능 |
SELECT EMP_NAME, SALARY, AVG(SALARY) OVER (PARTITION BY DEPT_ID) AS AVG_SAL FROM EMPLOYEE; || 부서별 평균 급여 | |
FIRST_VALUE(), LAST_VALUE() | 파티션 내 정렬 기준 첫/마지막 값 반환 |
SELECT EMP_NAME, SALARY, FIRST_VALUE(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS TOP_SAL FROM EMPLOYEE; || 부서별 최고 급여 |
⸻
✅ 추가 예제: 누적합(Cumulative Sum)
SELECT EMP_NAME, SALARY,
SUM(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY SALARY) AS CUM_SAL
FROM EMPLOYEE;
부서별 급여 누적합을 계산합니다.
⸻
✅ 윈도우 프레임 옵션
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
의미 설명 UNBOUNDED PRECEDING 현재 파티션의 맨 처음부터 CURRENT ROW 현재 행까지 1 PRECEDING, 1 FOLLOWING 앞뒤 1행까지 포함한 범위
예:
SUM(SALARY) OVER (
PARTITION BY DEPT_ID ORDER BY SALARY ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
부서별로 급여 순으로 정렬하고, 현재 행까지 누적된 급여 합계를 구합니다.
⸻
✅ 정리 요약 • 윈도우 함수는 분석용 SQL에서 매우 중요합니다. • OVER() 절로 집계 범위를 제한하며, 집계 결과를 각 행에 붙여서 반환합니다. • RANK, ROW_NUMBER, LAG/LEAD, FIRST_VALUE 등 다양하게 활용 가능합니다.
⸻
더 복잡한 예제로 윈도우 함수 + 서브쿼리 + 조건 분기 조합도 가능합니다. 필요하시면 고급 실무 예제도 만들어드릴게요! 원하시는 시나리오가 있으신가요? 💡