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()의 특징
- ROW_NUMBER()는 서브쿼리와 함께 사용하여 특정 행을 필터링합니다.
- 정렬 기준과 그룹화 기준을 조합하여 원하는 데이터를 정확히 선택할 수 있습니다.
- 동일한 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 |