자격증/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
반응형