전체 그룹에 대해 집계된 결과 1개만 반환
GROUP BY와 함께 자주 사용됨
-- 예: 부서별 인원 수 구하기
SELECT department_id, COUNT(*) AS dept_count
FROM employees
GROUP BY department_id;
결과: 각 부서별로 한 줄씩, 부서 인원 수 출력됨
👉 각 부서가 하나의 "그룹"이기 때문에, COUNT()는 그룹 단위로 동작함
SELECT empno, sal, deptno, SUM(sal) OVER(PARTITION BY deptno)
FROM emp;
근데 Partition BY를 써야 Group By처럼 분석함수를 집계함수로써 쓸 수 있음.
SELECT empno, sal FROM emp ORDER BY empno;
SELECT empno, sal, sum(sal) OVER
(ORDER BY empno) sum_sal
FROM emp;
SELECT empno, sal, row_number() over (order by sal) sum_sal
FROM emp; -- 그냥 숫자를 채우는데 같은 숫자면 공동순위로 12 3 44 6 이렇게
SELECT empno, sal, dense_rank() over (order by sal) sum_sal
FROM emp; -- dense_rank로 하면 1 2 3 44 5 6 이렇게
-- 예: 부서별 인원 수를 모든 행에 표시
SELECT employee_id, department_id,
COUNT(*) OVER(PARTITION BY department_id) AS dept_count
FROM employees;
📌 결과: 모든 사원의 정보에 자신이 속한 부서의 인원 수가 같이 붙어서 나옴
👉 행 개수는 그대로 유지되며, 부서별 인원 수가 반복적으로 표시됨
즉, 출력 행수를 그대로 유지!
OVER()는 RANK(), ROW_NUMBER(), SUM(), AVG() 등 여러 함수와 함께 사용 가능
PARTITION BY는 그룹 단위를 지정
ORDER BY는 윈도우 내 정렬 기준 지정