자격증/SQLD
ROW_NUMBER() 함수 완벽 정복
2주녘
2025. 5. 19. 21:34
반응형
SQL에서 데이터를 순위 매기듯 나열할 수 있다면 얼마나 유용할까요?
오늘은 그중에서도 가장 자주 쓰이는 순위 함수 ROW_NUMBER()에 대해 배우고,
직접 실습 테이블을 만들고 쿼리도 돌려보는 실습 포스트를 준비했어요!
🎯 ROW_NUMBER() 함수란?
ROW_NUMBER()는 SQL의 윈도우 함수(Window Function) 중 하나로, 지정한 정렬 기준에 따라 각 행에 고유한 순위를 부여합니다.
- 같은 값이 있어도 중복 없이 1, 2, 3… 식으로 순서가 매겨져요.
- 그룹화(PARTITION BY)와 정렬 기준(ORDER BY)을 통해 다양한 방식으로 순위를 나눌 수 있어요.
📌 문법
ROW_NUMBER() OVER (PARTITION BY 컬럼명 ORDER BY 정렬기준)
구성요소 | 설명 |
PARTITION BY | 그룹을 나누는 기준 (선택사항) |
ORDER BY | 순서를 매길 기준 (필수) |
🧪 실습 테이블 만들기 (오라클 기준)
📂 1. employees 테이블 생성
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
dept_name VARCHAR2(50),
salary NUMBER
);
💾 2. 샘플 데이터 삽입
INSERT INTO employees VALUES (1, '홍길동', '영업부', 5000);
INSERT INTO employees VALUES (2, '김철수', '영업부', 5500);
INSERT INTO employees VALUES (3, '이영희', '영업부', 5000);
INSERT INTO employees VALUES (4, '박민수', '개발부', 6000);
INSERT INTO employees VALUES (5, '최지우', '개발부', 6500);
INSERT INTO employees VALUES (6, '정해인', '개발부', 6000);
INSERT INTO employees VALUES (7, '장원영', '총무부', 4500);
INSERT INTO employees VALUES (8, '안유진', '총무부', 4600);
📊 실습 1: 부서별 급여순 1등만 출력
SELECT *
FROM (
SELECT
emp_id,
emp_name,
dept_name,
salary,
ROW_NUMBER() OVER (
PARTITION BY dept_name
ORDER BY salary DESC
) AS rn
FROM employees
)
WHERE rn = 1;

부서별 급여가 가장 높은 직원만 뽑아낸 결과입니다!
ROW_NUMBER()가 부서별로 급여 내림차순 정렬 후 순위를 부여하고,
rn = 1 조건으로 1등만 골라냈습니다.
📊 실습 2: 부서별 전체 순위 출력
SELECT
emp_id,
emp_name,
dept_name,
salary,
ROW_NUMBER() OVER (
PARTITION BY dept_name
ORDER BY salary DESC
) AS rn
FROM employees
ORDER BY dept_name, rn;

🎁 RANK() vs DENSE_RANK() vs ROW_NUMBER()
함수 | 동일한 값 처리 | 예시 결과 |
ROW_NUMBER() | 무조건 1, 2, 3… | 1, 2, 3 |
RANK() | 동일값은 같은 순위, 다음 순위 건너뜀 | 1, 1, 3 |
DENSE_RANK() | 동일값은 같은 순위, 다음 순위 건너뛰지 않음 | 1, 1, 2 |
반응형