DB

[DB][Oracle] ROW_NUMBER()

오선지♬ 2025. 1. 3. 20:11
728x90
반응형

Oracle에서 ROW_NUMBER() 사용법

1. 기본 사용법

전체 데이터를 기준으로 행 번호를 매기는 예제입니다.

SELECT 
    EMPLOYEE_ID, 
    NAME, 
    SALARY,
    ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS RN
FROM EMPLOYEES;

결과 예시:

EMPLOYEE_ID NAME SALARY RN
101 Alice 9000 1
102 Bob 8500 2
103 Charlie 8000 3

 

 

2. 그룹별로 번호 매기기 (PARTITION BY)

부서별로 번호를 매깁니다.

SELECT 
    DEPARTMENT_ID, 
    EMPLOYEE_ID, 
    NAME, 
    SALARY,
    ROW_NUMBER() OVER (
        PARTITION BY DEPARTMENT_ID 
        ORDER BY SALARY DESC
    ) AS RN
FROM EMPLOYEES;

결과 예시:

DEPARTMENT_ID EMPLOYEE_ID NAME SALARY RN
10 201 Alice 9000 1
10 202 Bob 8500 2
20 301 Charlie 8000 1
20 302 David 7500 2

 

3. 특정 그룹의 첫 번째 행만 가져오기

부서별 최고 연봉 직원을 선택합니다.

SELECT * 
FROM (
    SELECT 
        DEPARTMENT_ID, 
        EMPLOYEE_ID, 
        NAME, 
        SALARY,
        ROW_NUMBER() OVER (
            PARTITION BY DEPARTMENT_ID 
            ORDER BY SALARY DESC
        ) AS RN
    FROM EMPLOYEES
) SUBQUERY
WHERE RN = 1;

결과 예시:

DEPARTMENT_ID EMPLOYEE_ID NAME SALARY RN
10 201 Alice 9000 1
20 301 Charlie 8000 1

 

4. 중복 데이터 중 특정 조건에 맞는 데이터만 선택

제품별로 최신 업데이트 데이터를 가져오는 예제입니다.

SELECT * 
FROM (
    SELECT 
        PRODUCT_ID, 
        CATEGORY_ID, 
        PRICE,
        UPDATED_DATE,
        ROW_NUMBER() OVER (
            PARTITION BY CATEGORY_ID 
            ORDER BY UPDATED_DATE DESC
        ) AS RN
    FROM PRODUCTS
) SUBQUERY
WHERE RN = 1;

결과 예시:

PRODUCT_ID CATEGORY_ID PRICE UPDATED_DATE RN
1001 10 500 2025-01-01 1
2001 20 150 2025-01-02 1

 

5. JOIN에서 사용

ROW_NUMBER()를 활용하여 JOIN 시 특정 조건의 최신 데이터를 선택합니다.

SELECT 
    M.TENANT_CD,
    M.CR_CD,
    CI.LCAT_TP
FROM MAIN_TABLE M
LEFT JOIN (
    SELECT 
        TENANT_CD,
        CR_CD,
        LCAT_TP,
        ROW_NUMBER() OVER (
            PARTITION BY TENANT_CD, CR_CD 
            ORDER BY UPDATED_DATE DESC
        ) AS RN
    FROM T_CR_ITEM
) CI
ON M.TENANT_CD = CI.TENANT_CD 
   AND M.CR_CD = CI.CR_CD
WHERE CI.RN = 1;

 

Oracle에서 ROW_NUMBER()의 특징

  1. ROW_NUMBER()는 서브쿼리와 함께 사용하여 특정 행을 필터링합니다.
  2. 정렬 기준과 그룹화 기준을 조합하여 원하는 데이터를 정확히 선택할 수 있습니다.
  3. 동일한 PARTITION BY 그룹 내에서 각 행에 고유 번호를 부여합니다.

 

Oracle ROW_NUMBER()의 응용

  • 중복 제거
  • 그룹별 상위 N개의 데이터 선택
  • 최신 또는 가장 오래된 데이터 선택
  • JOIN과 결합하여 중복 데이터 처리

ROW_NUMBER()는 특히 JOIN 및 GROUP BY를 대체하거나 보완하여 더 효율적이고 명확한 쿼리를 작성하는 데 유용합니다.

728x90
반응형

'DB' 카테고리의 다른 글

[DB][Oracle] SUBSTR / SUBSTRING  (0) 2025.01.26
[DB][Oracle] FLOOR / TRUNC  (0) 2025.01.04
[DB] GROUP_CONCAT  (0) 2024.12.14
[DB][Oracle] 값이 없는 경우 update  (0) 2024.12.02
[DB][Oracle] 다중 Insert UNION ALL 사용  (0) 2024.11.29