편집 요약 없음 |
편집 요약 없음 |
||
(사용자 2명의 중간 판 10개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
=== 윈도우 함수란? === | === 윈도우 함수란? === | ||
{{요점 | {{요점 | ||
|내용=윈도우 함수란? | |내용=<big>윈도우 함수란?</big> | ||
* 일반적인 집계 함수(SUM, AVG, COUNT, 등)는 여러 행을 하나로 집계합니다. | * 일반적인 집계 함수(SUM, AVG, COUNT, 등)는 여러 행을 하나로 집계합니다. | ||
* 윈도우 함수는 집계를 하되, 각 행마다 | * 윈도우 함수는 집계를 하되, '''각 행마다 결과'''를 계산해서 반환합니다. | ||
* OVER() 절을 사용하며, PARTITION BY, ORDER BY, ROWS BETWEEN 등을 조합하여 정교한 분석이 가능합니다. | * OVER() 절을 사용하며, PARTITION BY, ORDER BY, ROWS BETWEEN 등을 조합하여 정교한 분석이 가능합니다. | ||
}} | }} | ||
=== | {{요점 | ||
|내용='''<big>윈도우 함수 와 분석 함수는 같은것인가 ?</big>''' | |||
* 결론: 모든 분석 함수는 윈도우 함수의 한 종류입니다. Oracle에서는 둘을 거의 같은 의미로 사용합니다. | |||
** 분석 함수 (Analytic Function) : Oracle에서 제공하는 특수한 SQL 함수로, OVER() 절을 통해 행의 집합(Window)에 대해 계산함 | |||
** 윈도우 함수 (Window Function) : SQL 표준에서 정의한 개념으로, OVER() 절을 사용하는 모든 함수를 가리킴 | |||
}} | |||
{{타이틀 | |||
|제목=<big>* Oracle에서 분석 함수(=윈도우 함수)</big> | |||
# 순위 함수: RANK(), DENSE_RANK(), ROW_NUMBER() | |||
# 누적 함수: SUM(), AVG(), COUNT(), MAX(), MIN() with OVER() | |||
# 시차 함수: LAG(), LEAD() | |||
# 분포 함수: NTILE(), PERCENT_RANK(), CUME_DIST() | |||
# 통계 함수: FIRST_VALUE(), LAST_VALUE() | |||
* 모두 OVER() 절을 동반해야 "분석 함수"로 동작합니다. | |||
}} | |||
=== 구문 기본 형태 === | |||
<source lang=sql> | <source lang=sql> | ||
<함수명>(컬럼) OVER ( | <함수명>(컬럼) OVER ( | ||
16번째 줄: | 32번째 줄: | ||
) | ) | ||
</source> | </source> | ||
=== 대표적인 윈도우 함수 목록 === | === 대표적인 윈도우 함수 목록 === | ||
27번째 줄: | 39번째 줄: | ||
! 함수명 !! 설명 !! 예제 SQL !! 설명 결과 | ! 함수명 !! 설명 !! 예제 SQL !! 설명 결과 | ||
|- | |- | ||
| ROW_NUMBER() || 파티션 내 행 번호를 순서대로 부여 || | | style="border-right: 1px solid #aaa; padding: 5px;" |'''ROW_NUMBER()''' | ||
SELECT EMP_NAME, ROW_NUMBER() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS RN | | style="border-right: 1px solid #aaa; padding: 5px;" |파티션 내 행 번호를 순서대로 부여 | ||
| style="border-right: 1px solid #aaa; padding: 5px;" |<source lang=sql> | |||
FROM EMPLOYEE; || 각 부서별 급여 내림차순 순위 (중복 순위 없음) | SELECT EMP_NAME | ||
, ROW_NUMBER() OVER (PARTITION BY DEPT_ID | |||
ORDER BY SALARY DESC) AS RN | |||
FROM EMPLOYEE; | |||
</source> | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |각 부서별 급여 내림차순 순위 (중복 순위 없음) | |||
|- | |- | ||
| RANK() || 동점자에게 같은 순위를 부여하고 다음 순위는 건너뜀 || | | style="border-right: 1px solid #aaa; padding: 5px;" |'''RANK()''' | ||
SELECT EMP_NAME, RANK() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS RANK | | style="border-right: 1px solid #aaa; padding: 5px;" |동점자에게 같은 순위를 부여하고 다음 순위는 건너뜀 | ||
| style="border-right: 1px solid #aaa; padding: 5px;" |<source lang=sql> | |||
FROM EMPLOYEE; || 부서 내 급여 순위 (동점자 동일 순위) | SELECT EMP_NAME | ||
, RANK() OVER (PARTITION BY DEPT_ID | |||
ORDER BY SALARY DESC) AS RANK | |||
FROM EMPLOYEE; | |||
</source> | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |부서 내 급여 순위 (동점자 동일 순위) | |||
|- | |- | ||
| DENSE_RANK() || RANK와 비슷하지만 순위를 건너뛰지 않음 || | | style="border-right: 1px solid #aaa; padding: 5px;" |'''DENSE_RANK()''' | ||
SELECT EMP_NAME, DENSE_RANK() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS DRANK | | style="border-right: 1px solid #aaa; padding: 5px;" |RANK와 비슷하지만 순위를 건너뛰지 않음 | ||
| style="border-right: 1px solid #aaa; padding: 5px;" | | |||
FROM EMPLOYEE; || 순위에 공백 없이 채워짐 | <source lang=sql> | ||
SELECT EMP_NAME | |||
, DENSE_RANK() OVER (PARTITION BY DEPT_ID | |||
ORDER BY SALARY DESC) AS DRANK | |||
FROM EMPLOYEE; | |||
</source> | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |순위에 공백 없이 채워짐 | |||
|- | |- | ||
| LAG() || 현재 행 기준 이전 행의 값을 가져옴 || | | style="border-right: 1px solid #aaa; padding: 5px;" |'''LAG()''' | ||
SELECT EMP_NAME, SALARY, LAG(SALARY) OVER (ORDER BY EMP_ID) AS PREV_SAL | | style="border-right: 1px solid #aaa; padding: 5px;" |현재 행 기준 이전 행의 값을 가져옴 | ||
| style="border-right: 1px solid #aaa; padding: 5px;" | | |||
FROM EMPLOYEE; || 이전 직원의 급여 정보 확인 | <source lang=sql> | ||
SELECT EMP_NAME, SALARY | |||
, LAG(SALARY) OVER (ORDER BY EMP_ID) AS PREV_SAL | |||
FROM EMPLOYEE; | |||
</source> | |||
| style="border-right: 1px solid #aaa; padding: 5px;" | 이전 직원의 급여 정보 확인 | |||
|- | |- | ||
| LEAD() || 현재 행 기준 다음 행의 값을 가져옴 || | | style="border-right: 1px solid #aaa; padding: 5px;" |'''LEAD()''' | ||
SELECT EMP_NAME, SALARY, LEAD(SALARY) OVER (ORDER BY EMP_ID) AS NEXT_SAL | | style="border-right: 1px solid #aaa; padding: 5px;" |현재 행 기준 다음 행의 값을 가져옴 | ||
| style="border-right: 1px solid #aaa; padding: 5px;" | | |||
FROM EMPLOYEE; || 다음 직원의 급여 정보 확인 | <source lang=sql> | ||
SELECT EMP_NAME, SALARY | |||
, LEAD(SALARY) OVER (ORDER BY EMP_ID) AS NEXT_SAL | |||
FROM EMPLOYEE; | |||
</source> | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |다음 직원의 급여 정보 확인 | |||
|- | |- | ||
| SUM(), AVG(), COUNT(), MAX(), MIN() || 집계 함수도 윈도우와 함께 사용 가능 || | | style="border-right: 1px solid #aaa; padding: 5px;" | '''SUM(), AVG(), COUNT(), MAX(), MIN()''' | ||
SELECT EMP_NAME, SALARY, AVG(SALARY) OVER (PARTITION BY DEPT_ID) AS AVG_SAL | | style="border-right: 1px solid #aaa; padding: 5px;" | 집계 함수도 윈도우와 함께 사용 가능 | ||
| style="border-right: 1px solid #aaa; padding: 5px;" |<source lang=sql> | |||
FROM EMPLOYEE; || 부서별 평균 급여 | SELECT EMP_NAME, SALARY | ||
, AVG(SALARY) OVER (PARTITION BY DEPT_ID) AS AVG_SAL | |||
</source> | |||
FROM EMPLOYEE;||부서별 평균 급여 | |||
|- | |- | ||
| FIRST_VALUE(), LAST_VALUE() || 파티션 내 정렬 기준 첫/마지막 값 반환 || | | style="border-right: 1px solid #aaa; padding: 5px;" | '''FIRST_VALUE(), LAST_VALUE()''' | ||
SELECT EMP_NAME, SALARY, FIRST_VALUE(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS TOP_SAL | | style="border-right: 1px solid #aaa; padding: 5px;" | 파티션 내 정렬 기준 첫/마지막 값 반환 | ||
| style="border-right: 1px solid #aaa; padding: 5px;" |<source lang=sql> | |||
FROM EMPLOYEE; || 부서별 최고 급여 | SELECT EMP_NAME, SALARY | ||
, FIRST_VALUE(SALARY) OVER (PARTITION BY DEPT_ID | |||
ORDER BY SALARY DESC) AS TOP_SAL | |||
FROM EMPLOYEE; | |||
</source> | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |부서별 최고 급여 | |||
|} | |} | ||
67번째 줄: | 113번째 줄: | ||
⸻ | ⸻ | ||
=== 예제: 누적합(Cumulative Sum) === | ====예제: 누적합(Cumulative Sum)==== | ||
SELECT EMP_NAME, SALARY, | SELECT EMP_NAME, SALARY, | ||
SUM(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY SALARY) AS CUM_SAL | SUM(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY SALARY) AS CUM_SAL | ||
77번째 줄: | 122번째 줄: | ||
⸻ | ⸻ | ||
=== 윈도우 프레임 옵션 === | === 윈도우 프레임 옵션=== | ||
<source lang=sql> | <source lang="sql"> | ||
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | ||
</source> | </source> | ||
{| class="wikitable" style="width:100%;" | {| class="wikitable" style="width:100%;" | ||
! style="width:30%;" | 의미 | ! style="width:30%;" |의미 | ||
! style="width:70%;" | 설명 | ! style="width:70%;" |설명 | ||
|- | |- | ||
| '''UNBOUNDED PRECEDING''' | |'''UNBOUNDED PRECEDING''' | ||
| 현재 파티션의 맨 처음부터 시작하는 윈도우 범위 지정<br>(예: 파티션 시작 ~ 현재 행까지 누적 계산 시 사용) | |현재 파티션의 맨 처음부터 시작하는 윈도우 범위 지정<br>(예: 파티션 시작 ~ 현재 행까지 누적 계산 시 사용) | ||
|- | |- | ||
| '''CURRENT ROW''' | |'''CURRENT ROW''' | ||
| 현재 행까지만 포함하는 윈도우 범위 지정<br>(예: 이동 평균 계산 시 행 단위 제한) | |현재 행까지만 포함하는 윈도우 범위 지정<br>(예: 이동 평균 계산 시 행 단위 제한) | ||
|- | |- | ||
| '''1 PRECEDING, 1 FOLLOWING''' | |'''1 PRECEDING, 1 FOLLOWING''' | ||
| 현재 행을 기준으로 앞뒤 1행씩 포함한 범위 지정<br>(예: 3행 이동 평균 계산 시 사용) | |현재 행을 기준으로 앞뒤 1행씩 포함한 범위 지정<br>(예: 3행 이동 평균 계산 시 사용) | ||
|} | |} | ||
예: | 예: | ||
<source lang=sql> | <source lang="sql"> | ||
SUM(SALARY) OVER ( | SUM(SALARY) OVER ( | ||
107번째 줄: | 152번째 줄: | ||
부서별로 급여 순으로 정렬하고, 현재 행까지 누적된 급여 합계를 구합니다. | 부서별로 급여 순으로 정렬하고, 현재 행까지 누적된 급여 합계를 구합니다. | ||
====실무 예제 1: 부서별 상위 3위 급여 직원 조회==== | |||
<source lang="sql"> | |||
=== 실무 예제 1: 부서별 상위 3위 급여 직원 조회 === | |||
<source lang=sql> | |||
SELECT * | SELECT * | ||
FROM ( | FROM ( | ||
125번째 줄: | 166번째 줄: | ||
실무 활용: 팀별 Top Performer 조회 등 | 실무 활용: 팀별 Top Performer 조회 등 | ||
=== | ==== 실무 예제 2: 직전과의 급여 변화량 분석==== | ||
<source lang=sql> | <source lang="sql"> | ||
SELECT EMP_ID, EMP_NAME, SALARY, | SELECT EMP_ID, EMP_NAME, SALARY, | ||
LAG(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE) AS PREV_SAL, | LAG(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE) AS PREV_SAL, | ||
136번째 줄: | 177번째 줄: | ||
실무 활용: 급여 갭 파악, 트렌드 분석 등 | 실무 활용: 급여 갭 파악, 트렌드 분석 등 | ||
====실무 예제 3: 부서별 누적 인건비 계산==== | |||
<source lang=sql> | <source lang="sql"> | ||
SELECT EMP_ID, EMP_NAME, DEPT_ID, SALARY, | SELECT EMP_ID, EMP_NAME, DEPT_ID, SALARY, | ||
SUM(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE | SUM(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE | ||
147번째 줄: | 188번째 줄: | ||
실무 활용: 연속적인 비용 추적, 월별 누적 등 | 실무 활용: 연속적인 비용 추적, 월별 누적 등 | ||
=== | ====실무 예제 4: 최초 입사자 정보 함께 보여주기 (FIRST_VALUE)==== | ||
<source lang=sql> | <source lang="sql"> | ||
SELECT EMP_ID, EMP_NAME, DEPT_ID, HIRE_DATE, | SELECT EMP_ID, EMP_NAME, DEPT_ID, HIRE_DATE, | ||
FIRST_VALUE(EMP_NAME) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE) AS FIRST_JOINED | FIRST_VALUE(EMP_NAME) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE) AS FIRST_JOINED | ||
157번째 줄: | 198번째 줄: | ||
실무 활용: 리더, 시니어 직원 분석 등 | 실무 활용: 리더, 시니어 직원 분석 등 | ||
=== | ====실무 예제 5: 부서 내 직원 수 대비 자신의 비율 (비율 분석)==== | ||
<source lang=sql> | <source lang="sql"> | ||
SELECT EMP_ID, EMP_NAME, DEPT_ID, | SELECT EMP_ID, EMP_NAME, DEPT_ID, | ||
COUNT(*) OVER (PARTITION BY DEPT_ID) AS DEPT_TOTAL, | COUNT(*) OVER (PARTITION BY DEPT_ID) AS DEPT_TOTAL, | ||
171번째 줄: | 212번째 줄: | ||
이 외에도, 윈도우 함수는 보고서, 통계 분석, SLA 계산, 재고 흐름 추적 등 다양한 실무 시나리오에 활용됩니다. | 이 외에도, 윈도우 함수는 보고서, 통계 분석, SLA 계산, 재고 흐름 추적 등 다양한 실무 시나리오에 활용됩니다. | ||
===요점 정리=== | |||
• 윈도우 함수는 분석용 SQL에서 매우 중요합니다. | |||
• OVER() 절로 집계 범위를 제한하며, 집계 결과를 각 행에 붙여서 반환합니다. | • OVER() 절로 집계 범위를 제한하며, 집계 결과를 각 행에 붙여서 반환합니다. | ||
• RANK, ROW_NUMBER, LAG/LEAD, FIRST_VALUE 등 다양하게 활용 가능합니다. | • RANK, ROW_NUMBER, LAG/LEAD, FIRST_VALUE 등 다양하게 활용 가능합니다. |
2025년 5월 30일 (금) 18:41 기준 최신판
윈도우 함수란?
menu_book 윈도우 함수란?
- 일반적인 집계 함수(SUM, AVG, COUNT, 등)는 여러 행을 하나로 집계합니다.
- 윈도우 함수는 집계를 하되, 각 행마다 결과를 계산해서 반환합니다.
- OVER() 절을 사용하며, PARTITION BY, ORDER BY, ROWS BETWEEN 등을 조합하여 정교한 분석이 가능합니다.
menu_book 윈도우 함수 와 분석 함수는 같은것인가 ?
- 결론: 모든 분석 함수는 윈도우 함수의 한 종류입니다. Oracle에서는 둘을 거의 같은 의미로 사용합니다.
- 분석 함수 (Analytic Function) : Oracle에서 제공하는 특수한 SQL 함수로, OVER() 절을 통해 행의 집합(Window)에 대해 계산함
- 윈도우 함수 (Window Function) : SQL 표준에서 정의한 개념으로, OVER() 절을 사용하는 모든 함수를 가리킴
notifications_active* Oracle에서 분석 함수(=윈도우 함수)
- 순위 함수: RANK(), DENSE_RANK(), ROW_NUMBER()
- 누적 함수: SUM(), AVG(), COUNT(), MAX(), MIN() with OVER()
- 시차 함수: LAG(), LEAD()
- 분포 함수: NTILE(), PERCENT_RANK(), CUME_DIST()
- 통계 함수: FIRST_VALUE(), LAST_VALUE()
- 모두 OVER() 절을 동반해야 "분석 함수"로 동작합니다.
구문 기본 형태
<함수명>(컬럼) 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행씩 포함한 범위 지정 (예: 3행 이동 평균 계산 시 사용) |
예:
SUM(SALARY) OVER ( PARTITION BY DEPT_ID ORDER BY SALARY ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
부서별로 급여 순으로 정렬하고, 현재 행까지 누적된 급여 합계를 구합니다.
실무 예제 1: 부서별 상위 3위 급여 직원 조회
SELECT * FROM ( SELECT EMP_ID, EMP_NAME, DEPT_ID, SALARY, RANK() OVER (PARTITION BY DEPT_ID ORDER BY SALARY DESC) AS SAL_RANK FROM EMPLOYEE ) WHERE SAL_RANK <= 3;
각 부서별로 급여 순위를 매긴 뒤, 상위 3명의 직원만 필터링합니다.
실무 활용: 팀별 Top Performer 조회 등
실무 예제 2: 직전과의 급여 변화량 분석
SELECT EMP_ID, EMP_NAME, SALARY, LAG(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE) AS PREV_SAL, SALARY - LAG(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE) AS DIFF_SAL FROM EMPLOYEE;
부서 내 입사일 기준으로 정렬하여 직전 직원과 급여 차이를 분석합니다.
실무 활용: 급여 갭 파악, 트렌드 분석 등
실무 예제 3: 부서별 누적 인건비 계산
SELECT EMP_ID, EMP_NAME, DEPT_ID, SALARY, SUM(SALARY) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CUM_SALARY FROM EMPLOYEE;
입사일 기준으로 누적 급여를 계산합니다.
실무 활용: 연속적인 비용 추적, 월별 누적 등
실무 예제 4: 최초 입사자 정보 함께 보여주기 (FIRST_VALUE)
SELECT EMP_ID, EMP_NAME, DEPT_ID, HIRE_DATE, FIRST_VALUE(EMP_NAME) OVER (PARTITION BY DEPT_ID ORDER BY HIRE_DATE) AS FIRST_JOINED FROM EMPLOYEE;
각 부서에서 가장 먼저 입사한 직원의 이름을 모든 직원에게 보여줍니다.
실무 활용: 리더, 시니어 직원 분석 등
실무 예제 5: 부서 내 직원 수 대비 자신의 비율 (비율 분석)
SELECT EMP_ID, EMP_NAME, DEPT_ID, COUNT(*) OVER (PARTITION BY DEPT_ID) AS DEPT_TOTAL, 1.0 / COUNT(*) OVER (PARTITION BY DEPT_ID) AS RATIO FROM EMPLOYEE;
각 직원이 부서 인원 중 차지하는 비율을 계산합니다.
실무 활용: KPI 가중치, 구성비 분석 등
이 외에도, 윈도우 함수는 보고서, 통계 분석, SLA 계산, 재고 흐름 추적 등 다양한 실무 시나리오에 활용됩니다.
요점 정리
• 윈도우 함수는 분석용 SQL에서 매우 중요합니다. • OVER() 절로 집계 범위를 제한하며, 집계 결과를 각 행에 붙여서 반환합니다. • RANK, ROW_NUMBER, LAG/LEAD, FIRST_VALUE 등 다양하게 활용 가능합니다.