본문 바로가기

자격증/SQLD

[SQLD][아이리포]23. 서브쿼리 | 윈도우 함수 | RANK | DENSE_RANK | ROW_NUMBER | PARTITION BY | SQL파티션

반응형
목차

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와 달리 기존 행은 그대로 유지되며 각 행에 계산 결과가 추가된다.


🔗 출처

[SQLD 모든 것]

 

 

 

반응형