Oracle

Ranking by group with ROW_NUMBER()

청춘고양이 2024. 6. 14. 17:26
반응형

함수별 성능 차이

  • ROW_NUMBER(): 각 행에 고유한 순위를 부여하므로, 동일한 값에 대해 특별한 처리를 하지 않아도 됩니다. 따라서 가장 단순한 계산을 수행합니다.
  • RANK(): 동일한 값에 대해 동일한 순위를 부여하고, 다음 순위를 건너뛰기 때문에 좀 더 복잡한 계산이 필요합니다.
  • DENSE_RANK(): 동일한 값에 대해 동일한 순위를 부여하지만, 다음 순위를 건너뛰지 않으므로 RANK()보다는 덜 복잡하지만 ROW_NUMBER()보다는 복잡합니다.

Oracle에서 그룹별로 순위를 부여하는 방식은 ROW_NUMBER(), RANK(), 그리고 DENSE_RANK() 함수들을 사용하여 쉽게 구현할 수 있습니다. 각 함수는 약간씩 다른 방식으로 순위를 매기지만, 이 포스팅에서는 ROW_NUMBER() 함수를 사용하여 그룹별 순위를 부여하는 방법을 설명하겠습니다.


ROW_NUMBER()를 사용한 그룹별 순위 부여 방법

1. ROW_NUMBER() 함수란?

ROW_NUMBER() 함수는 쿼리 결과 집합에서 각 행에 고유한 번호를 할당합니다. 이 함수는 OVER() 절과 함께 사용되며, 특히 PARTITION BY 절과 ORDER BY 절을 조합하여 특정 그룹 내에서 순위를 부여할 수 있습니다.

2. 예제 테이블 및 데이터

먼저, 순위를 부여할 예제 테이블과 데이터를 준비해 보겠습니다.

CREATE TABLE sales (
    salesperson VARCHAR2(50),
    region VARCHAR2(50),
    sales_amount NUMBER
);

INSERT INTO sales (salesperson, region, sales_amount) VALUES ('Alice', 'East', 500);
INSERT INTO sales (salesperson, region, sales_amount) VALUES ('Bob', 'West', 300);
INSERT INTO sales (salesperson, region, sales_amount) VALUES ('Charlie', 'East', 700);
INSERT INTO sales (salesperson, region, sales_amount) VALUES ('David', 'West', 200);
INSERT INTO sales (salesperson, region, sales_amount) VALUES ('Eve', 'East', 600);

3. 그룹별 순위 부여 쿼리

이제 ROW_NUMBER() 함수를 사용하여 지역별로 매출액에 따라 순위를 부여하는 쿼리를 작성해 보겠습니다.

SELECT
    salesperson,
    region,
    sales_amount,
    ROW_NUMBER() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS rnk
FROM
    sales;

4. 쿼리 결과

위 쿼리의 결과는 다음과 같습니다.

5. 설명

  • PARTITION BY region: 지역(region)별로 그룹을 나눕니다.
  • ORDER BY sales_amount DESC: 매출액(sales_amount)을 기준으로 내림차순으로 정렬합니다.
  • ROW_NUMBER(): 각 그룹 내에서 정렬된 순서대로 고유한 순위를 부여합니다.

이와 같이 ROW_NUMBER() 함수를 사용하여 특정 그룹 내에서 원하는 기준으로 정렬하고 순위를 부여할 수 있습니다. 이 방법은 데이터 분석이나 리포팅에서 매우 유용하게 사용될 수 있습니다.

반응형