목차
4. 서브쿼리
4-4. 윈도우함수
4-4-1. 순위함수
4-4-1-1. RANK
4-4-1-2. DENSE_RANK
4-4-1-3. ROW_NUMBER
4-4-2. 집계함수
4. 서브쿼리
4-4. 윈도우함수
윈도우 함수는 각 행의 값을 유지하면서 행별로 순위, 집계 등의 연산을 수행하는 함수이다.
GROUP BY와 달리 행을 하나로 묶지 않기 때문에 기존 행의 개수는 그대로 유지되며, 각 행에 새로운 값을 추가하거나 기존 값을 계산하여 반환한다.
대표적인 윈도우 함수로는 RANK, DENSE_RANK, ROW_NUMBER 등이 있으며 모든 함수는 OVER() 절과 함께 사용한다.
1️⃣ 순위함수
순위 함수는 데이터의 순위를 계산하여 각 행에 순위 값을 부여하는 함수이다.
| 함수명 | 설명 | 예 |
| RANK | 동일한 값은 같은 순위를 부여하며, 다음 순위는 건너뛴다. | 1,2,2,4,4,4,7 |
| DENSE_RANK | 동일한 값은 같은 순위를 부여하지만, 다음 순위를 건너뛰지 않는다. | 1,2,2,3,3,3,4 |
| ROW_NUMBER | 동일한 값이라도 모든 행에 고유한 번호를 부여한다. | 1,2,3,4,5,6,7 |
🔸 RANK
동일한 값에는 같은 순위를 부여하며, 다음 순위는 건너뛴다.
🔹 기본 사용법
SELECT A
,COUNT(*)
,RANK() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM DUAL
GROUP BY A;
🔹 예제

SELECT MPG
,COUNT(*)
,RANK() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM MTCARS
GROUP BY MPG;
➜ MPG 별 데이터를 그룹핑하여 개수를 구한 후, COUNT가 많은 순서대로 순위를 부여한다.
➜ DESC를 사용했으므로 COUNT가 큰 값일수록 높은 순위를 갖는다.
🔹 실행결과

🔸 DENSE_RANK
동일한 값에는 같은 순위를 부여하지만 순위를 건너뛰지 않는다.
🔹 기본 사용법
SELECT A
,COUNT(*)
,DENSE_RANK() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM DUAL
GROUP BY A;
🔹 예제
SELECT MPG
,COUNT(*)
,DENSE_RANK() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM MTCARS
GROUP BY MPG;
➜ 동일한 COUNT에는 같은 순위를 부여하며 다음 순위는 연속적으로 부여된다.
🔹 실행결과

🔸 ROW_NUMBER
조회된 모든 행에 고유한 순번을 부여한다.
동일한 값이 존재하더라도 순번은 중복되지 않는다.
🔹 기본 사용법
SELECT A
,COUNT(*)
,ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM DUAL
GROUP BY A;
🔹 예제
SELECT MPG
,COUNT(*)
,ROW_NUMBER() OVER(ORDER BY COUNT(*) DESC) AS RANK
FROM MTCARS
GROUP BY MPG;
➜ COUNT가 같더라도 각 행마다 서로 다른 순번을 부여한다.
🔹 실행결과

📌 RANK 함수 비교
| 순서 | RANK | DENSE_RANK | ROW_NUMBER |
| 100 | 1 | 1 | 1 |
| 90 | 2 | 2 | 2 |
| 90 | 2 | 2 | 3 |
| 80 | 4 | 3 | 4 |
2️⃣ 집계함수
윈도우 집계 함수는 각 행을 유지한 상태에서 그룹별 집계 결과를 함께 조회할 수 있는 함수이다.
| 함수명 | 설명 |
| COUNT | 파티션별 행의 개수 또는 누적 개수를 계산한다. |
| SUM | 파티션 별 합계 또는 누적 합계를 계산한다. |
| AVG | =파티션 별 평균 또는 누적 평균을 계산한다. |
| MIN | 파티션 별 최솟값을 반환한다. |
| MAX | 파티션 별 최댓값을 반환한다. |
🔹 기본 사용법
SELECT A
,B
,COUNT(*) OVER(PARTITION BY B) AS PART_B_CNT
FROM DUAL;
🔹 예제
SELECT NAME
,CYL
,COUNT(*) OVER(PARTITION BY CYL) AS PART_CYL_CNT
FROM MTCARS
WHERE CYL <= 6;
➜ CYL 값을 기준으로 파티션을 나눈 후, 각 파티션별 데이터 개수를 계산한다.
🔹 실행결과

📌 PARTITION BY
PARTITION BY는 특정 컬럼을 기준으로 데이터를 그룹(파티션)으로 나누어 윈도우 함수를 수행하는 절이다.
GROUP BY와 달리 기존 행은 그대로 유지되며 각 행에 계산 결과가 추가된다.
🔗 출처