SQLD 기출 패턴에서 자주 등장하는 윈도우 함수 RANK, DENSE_RANK, ROW_NUMBER 비교
SQLD 시험에서 윈도우 함수는 데이터 분석과 처리에 매우 중요한 역할을 하며, 특히 RANK, DENSE_RANK, ROW_NUMBER는 기출 문제에서 반복적으로 등장하는 핵심 SQL 함수입니다. 이 함수들은 데이터 집합 내에서 레코드의 순위를 산정하는 데 사용되기 때문에, 각각의 동작 방식과 차이점을 정확하게 이해하는 것이 매우 중요합니다. 실제 현업 데이터베이스 운영이나 데이터 분석 업무에 있어서도 이 세 윈도우 함수는 필수적으로 활용되고 있으므로, SQLD 기출 패턴을 기반으로 한 심층적인 비교와 실전 적용 방법에 대해 상세하게 알아보겠습니다.
윈도우 함수란 무엇인가?
윈도우 함수(Window Function)는 SQL에서 집계 함수와 유사하지만, 집계 결과를 집합의 각 행에 대해 반환하는 함수입니다. 윈도우 함수는 OVER 절과 함께 사용되어, 전체 데이터 집합 또는 파티션(부분 집합) 내에서 연산을 수행할 수 있습니다. SQLD 시험에서는 윈도우 함수의 기본 구조와 동작 원리를 정확히 이해하고, RANK, DENSE_RANK, ROW_NUMBER 등 주요 함수의 차이점을 파악하는 것이 중요합니다. 이 세 함수는 데이터의 순위와 관련된 연산을 수행하며, 동점 처리 방식이나 순위 부여 방식에서 차이가 있습니다.
RANK 함수의 동작 원리와 특징
RANK 함수는 데이터 집합에서 순위를 부여하는 데 사용되며, 동일한 값에 대해 동일한 순위를 부여하고, 그 다음 순위는 건너뛰는 방식(즉, 중복 순위 이후에는 건너뛴 순위가 매겨짐)으로 동작합니다. 예를 들어, 점수(rank) 기준으로 내림차순 정렬 시, 1등이 두 명이 나오면 그 다음은 3등이 됩니다. SQLD 기출 패턴에서는 RANK 함수가 동점 처리에서 순위가 건너뛰는 방식으로 부여된다는 점을 자주 묻는 문제들이 등장합니다.
| 이름 | 점수 | RANK() |
|---|---|---|
| 홍길동 | 95 | 1 |
| 김철수 | 90 | 2 |
| 이영희 | 90 | 2 |
| 박민수 | 85 | 4 |
위 예시에서 김철수와 이영희는 점수가 같으므로 동일한 2위가 부여되고, 박민수는 3위를 건너뛰고 4위가 됩니다. SQLD 기출 패턴에서는 이런 RANK 함수의 순위 건너뛰기 특징이 자주 출제 포인트가 되므로, 정확한 이해가 필요합니다.
DENSE_RANK 함수의 동작 원리와 특징
DENSE_RANK 함수는 RANK 함수와 유사하지만, 동일한 값에 동일한 순위를 부여한 뒤에도 그 다음 순위가 건너뛰지 않고 연속적으로 부여됩니다. 즉, 동점이 있어도 다음 순위는 바로 이어집니다. SQLD 기출 패턴에서는 DENSE_RANK 함수의 순위 연속성에 초점을 맞춘 문제가 자주 등장합니다.
| 이름 | 점수 | DENSE_RANK() |
|---|---|---|
| 홍길동 | 95 | 1 |
| 김철수 | 90 | 2 |
| 이영희 | 90 | 2 |
| 박민수 | 85 | 3 |
이처럼 DENSE_RANK 함수는 동점자 이후에도 순위가 연속적으로 증가합니다. SQLD 기출 패턴에서 DENSE_RANK 함수는 집계, 그룹핑, 순위 연산에서 자주 활용되며, RANK 함수와의 차이를 명확히 이해해야 문제를 빠르고 정확하게 풀 수 있습니다.
ROW_NUMBER 함수의 동작 원리와 특징
ROW_NUMBER 함수는 데이터 집합에서 각 행에 고유한 일련번호를 부여합니다. 동일한 값이 있더라도 무조건 순차적으로 1, 2, 3, 4…와 같이 연속적인 번호가 할당됩니다. SQLD 기출 패턴에서 ROW_NUMBER 함수는 중복을 제거하거나, 각 그룹에서 상위 N개의 데이터를 추출할 때 자주 활용됩니다.
| 이름 | 점수 | ROW_NUMBER() |
|---|---|---|
| 홍길동 | 95 | 1 |
| 김철수 | 90 | 2 |
| 이영희 | 90 | 3 |
| 박민수 | 85 | 4 |
위 표에서 볼 수 있듯이, ROW_NUMBER 함수는 동점 여부와 상관없이 순차적으로 번호를 부여합니다. SQLD 기출 패턴에서는 ROW_NUMBER를 이용해 각 파티션별로 첫 번째 데이터를 추출하는 문제나, 중복 데이터 제거와 관련된 문제가 자주 출제됩니다.
RANK, DENSE_RANK, ROW_NUMBER 함수의 SQLD 기출 패턴별 실전 예시
1. 윈도우 함수의 기본 사용법과 ORDER BY 절
SQLD 기출 패턴에서 RANK, DENSE_RANK, ROW_NUMBER 함수는 주로 다음과 같은 기본 구문으로 등장합니다.
SELECT 이름, 점수, RANK() OVER (ORDER BY 점수 DESC) AS 순위1, DENSE_RANK() OVER (ORDER BY 점수 DESC) AS 순위2, ROW_NUMBER() OVER (ORDER BY 점수 DESC) AS 일련번호 FROM 학생;
이 구문은 점수를 기준으로 내림차순 정렬하여, 각각의 행에 대해 RANK, DENSE_RANK, ROW_NUMBER의 결과를 동시에 보여줍니다. SQLD 기출 패턴에서는 이와 같은 기본 사용법을 기반으로 함수의 결과를 비교하거나, 특정 순위에 해당하는 데이터를 추출하는 등의 문제가 자주 나옵니다. 이때 ORDER BY 절의 방향(ASC/DESC)에 따라 결과가 달라질 수 있음을 유의해야 합니다.
2. RANK, DENSE_RANK, ROW_NUMBER의 결과 비교
SQLD 기출 패턴에서는 동일한 데이터에 대해 RANK, DENSE_RANK, ROW_NUMBER를 적용했을 때의 결과 차이를 물어보는 문제가 자주 출제됩니다. 아래 표는 이 세 함수의 결과를 한 번에 비교할 수 있도록 정리한 예시입니다.
| 이름 | 점수 | RANK() | DENSE_RANK() | ROW_NUMBER() |
|---|---|---|---|---|
| 홍길동 | 95 | 1 | 1 | 1 |
| 김철수 | 90 | 2 | 2 | 2 |
| 이영희 | 90 | 2 | 2 | 3 |
| 박민수 | 85 | 4 | 3 | 4 |
이 표를 통해, RANK와 DENSE_RANK는 동점자 처리에서 순위 건너뛰기 여부로 결과가 달라지고, ROW_NUMBER는 무조건 일련번호를 부여함을 알 수 있습니다. SQLD 기출 패턴에서는 이런 결과 차이를 묻는 문제가 자주 출제되므로, 표 형태로 정리해 연습하는 것이 효과적입니다.
3. 파티션(Partition By)과 윈도우 함수의 조합
SQLD 기출 패턴에서는 파티션을 이용해 그룹별로 RANK, DENSE_RANK, ROW_NUMBER를 적용하는 문제가 자주 등장합니다. 파티션을 사용하면, 전체 데이터가 아닌 파티션별(예: 학급별, 부서별 등)로 순위를 부여할 수 있습니다.
SELECT 학급, 이름, 점수, RANK() OVER (PARTITION BY 학급 ORDER BY 점수 DESC) AS 학급별순위 FROM 학생;
이 쿼리는 학생 테이블에서 학급별로 점수를 내림차순 정렬하여 RANK 순위를 매깁니다. SQLD 기출 패턴에서는 PARTITION BY 절의 활용과 파티션 내에서의 순위 부여 방식, 그리고 각 윈도우 함수별 결과 차이가 자주 출제 포인트가 됩니다. 파티션을 활용하면 대규모 데이터 집합에서 그룹별 최상위 또는 하위 데이터를 효율적으로 추출할 수 있습니다.
4. 실무와 SQLD 기출 패턴에서의 활용 사례
RANK, DENSE_RANK, ROW_NUMBER 함수는 실무 데이터 분석 작업과 SQLD 시험에서 모두 매우 빈번하게 사용됩니다. 예를 들어, 판매 데이터에서 월별 매출 상위 3개 품목을 추출하거나, 부서별로 연봉 상위 직원 명단을 산출하는 등 다양한 실전 문제에서 활용됩니다. SQLD 기출 패턴에서는 다음과 같은 형태의 문제가 출제됩니다.
SELECT
부서,
사원명,
연봉
FROM (
SELECT
부서,
사원명,
연봉,
ROW_NUMBER() OVER (PARTITION BY 부서 ORDER BY 연봉 DESC) AS rn
FROM
사원
) t
WHERE
rn = 1;
이 쿼리는 각 부서별로 연봉이 가장 높은 사원만을 추출합니다. SQLD 기출 패턴에서는 이러한 실무적 활용을 바탕으로, 윈도우 함수의 적절한 선택과 적용 방식을 묻는 문제가 자주 출제됩니다.
RANK, DENSE_RANK, ROW_NUMBER 함수의 주요 차이점 요약
SQLD 기출 패턴에서 RANK, DENSE_RANK, ROW_NUMBER 함수의 차이를 한눈에 파악할 수 있도록 다음과 같이 요약할 수 있습니다.
| 함수명 | 동점 처리 | 순위 건너뜀 여부 | 사용 예시 |
|---|---|---|---|
| RANK | 동일 값에 동일 순위 부여 | 다음 순위는 건너뜀 | 순위 건너뜀이 중요한 경우 |
| DENSE_RANK | 동일 값에 동일 순위 부여 | 다음 순위는 건너뛰지 않음 | 순위 연속성이 중요한 경우 |
| ROW_NUMBER | 무조건 연속 일련번호 부여 | 순위 건너뜀 없음 | 중복 없이 일련번호 필요 시 |
이처럼 RANK, DENSE_RANK, ROW_NUMBER 함수는 동점 처리와 순위 부여 방식에서 차이가 있으며, SQLD 기출 패턴에서는 이를 구분하는 문제가 반복적으로 출제됩니다. 특히, 동점 처리 후 순위가 건너뛰는지, 연속적으로 부여되는지, 혹은 일련번호가 무조건 부여되는지에 따라 선택해야 할 함수가 달라지므로, 실전 적용 시 주의가 필요합니다.
SQLD 기출 패턴에서 함수별 오답 유형 및 주의 사항
SQLD 기출 패턴을 분석해보면, RANK, DENSE_RANK, ROW_NUMBER 함수에서 자주 발생하는 오답 유형은 다음과 같습니다. 첫째, 동점 처리에서 순위 건너뛰기 여부를 혼동하는 경우가 많습니다. 특히, RANK와 DENSE_RANK의 결과 차이를 정확히 이해하지 못하면 잘못된 결과를 도출할 수 있습니다. 둘째, ROW_NUMBER 함수의 동작 원리를 잘못 이해해, 중복 데이터에 대해 동일한 순위가 부여될 것이라고 오해하는 경우가 있습니다. 셋째, PARTITION BY 절과 함께 사용시, 파티션 범위를 잘못 지정해 그룹별 순위가 아닌 전체 데이터에 대한 순위가 할당되는 실수가 많습니다.
이러한 오답 유형을 방지하기 위해서는, SQLD 기출 패턴 문제를 충분히 연습하고, 실제 데이터와 함께 함수별 결과를 표로 정리해보는 것이 효과적입니다. 또한, 각 함수의 차이점을 단순 암기가 아닌, 실제 예제와 함께 반복적으로 적용해보는 것이 중요합니다.
SQLD 기출 패턴 윈도우 함수(RANK, DENSE_RANK, ROW_NUMBER) 비교의 실전 팁과 요약
SQLD 기출 패턴에서 RANK, DENSE_RANK, ROW_NUMBER 함수를 효율적으로 활용하기 위해서는, 각 함수의 동작 방식과 파라미터 설정, 그리고 실전 문제에서의 활용 패턴을 충분히 숙지하는 것이 필요합니다. 특히, 순위 부여 방식(동점자 처리 및 순위 건너뛰기 여부), PARTITION BY와 ORDER BY 절의 활용, 그리고 결과 해석 능력을 갖추는 것이 중요합니다. 또한, 실제 SQL 실행 결과를 표 형태로 직접 확인해보며, 각 함수의 차이점을 스스로 정리해보는 연습이 합격에 큰 도움이 됩니다.
SQLD 기출 패턴에서는 RANK, DENSE_RANK, ROW_NUMBER 함수의 비교와 차별점, 그리고 실전 데이터 집합에의 적용 방식을 명확히 이해한 수험생이 좋은 성적을 거두는 경향이 강합니다. 이 세 함수는 데이터 분석, 통계, 순위 산정 등 다양한 IT 실무 분야에서도 매우 널리 사용되는 만큼, SQLD 자격증 취득을 준비하는 과정에서 반드시 마스터해야 할 핵심 기능임을 명심해야 합니다.
이상으로 SQLD 기출 패턴에서 자주 등장하는 윈도우 함수 RANK, DENSE_RANK, ROW_NUMBER의 차이점과 활용법, 그리고 실전 적용에서의 주의 사항을 심도 있게 살펴보았습니다. 이 내용을 반복 숙지하고, 실제 데이터로 여러 문제를 풀어보는 것이 SQLD 합격의 지름길이 됩니다.