집계 함수 SUM()은 결과 집합의 특정 그룹에 대해 모든 행의 값을 합산하여 각 그룹(또는 전체 쿼리)에 대해 하나의 값을 반환합니다. 윈도우 함수 SUM()은 OVER()를 통해 SELECT 내에서 정의된 "창" 값에 대한 합계를 계산할 수 있도록 하며, 이 경우 각 행은 결과에 유지되고 자신의 "창"에 대한 집계 결과에 접근할 수 있습니다. 이는 그룹에 대한 중간 결과를 얻는 데 특히 유용합니다.
집계 함수 예시:
SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
윈도우 함수 예시:
SELECT department_id, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) FROM employees;
“GROUP BY만으로 열에 대한 누적 합계를 얻을 수 있는가?”
답변: 아니요! GROUP BY는 최종 집계만 제공합니다. 누적 합계는 윈도우 함수나 더 복잡한 서브쿼리가 필요하며, 이는 더 복잡하고 느립니다.
예시:
SELECT salary, SUM(salary) OVER (ORDER BY hire_date) AS running_total FROM employees;
사례
트랜잭션 보고서에서 누적 합계는 많은 상관 서브쿼리로 구현되었습니다. 테이블이 커짐에 따라 성능이 수십 배 떨어졌습니다. 윈도우 함수로 전환하니 성능이 초 단위로 돌아왔습니다.
사례
GROUP BY를 통해 그룹별 결산을 복잡하게 분석하려고 하니 여러 단계의 데이터 추출 및 외부 소프트웨어 처리가 필요했습니다. 윈도우 함수는 하나의 SQL 쿼리로 필요한 보고서를 생성할 수 있게 해주었습니다.
사례
분석가가 잘못된 PARTITION BY를 사용하여 윈도우 함수가 포함된 쿼리를 작성했습니다. 결과적으로 다른 그룹의 데이터가 뒤섞였습니다. 최종 결과는 왜곡된 보고서였습니다. 그룹 나누기를 수정한 후 데이터가 올바르게 나타났습니다.