
이번 포스팅에서는 SQL에서 행의 순서를 매기는데 사용되는 윈도우 함수인 RANK() , DENSE_RANK() , ROW_NUMBER()에 대해서 알아봅시다! 이 함수들은 각각 조금씩 다른 방식으로 순위를 매긴답니다 😆
RANK()순위를 매길 때, 동점에 같은 순위를 주고 다음 순위는 건너뜁니다 (e.g. 1, 1, 3, 3, 5, 6).
RANK() OVER (ORDER BY column_name [ASC|DESC])
DENSE_RANK()순위를 매길 때, 동점에 같은 순위를 주고 다음 순위는 안 건너뜁니다 (e.g. 1, 1, 2, 2, 3, 4)
DENSE_RANK() OVER (ORDER BY column_name [ASC|DESC])
ROW_NUMBER()순위와 상관없이 각 행(row)에 고유 번호를 부여합니다.
ROW_NUMBER() OVER (ORDER BY column_name [ASC|DESC])
products 테이블| 컬럼명 | 타입 | 설명 |
|---|---|---|
| id | INT | 제품 ID (기본 키) |
| name | VARCHAR(50) | 제품 이름 |
| category | VARCHAR(50) | 제품 카테고리 |
| price | DECIMAL(10,2) | 제품 가격 |
| stock_quantity | INT | 재고 수량 |
SELECT name, price,
RANK() OVER (ORDER BY price DESC) AS rank_order,
DENSE_RANK() OVER (ORDER BY price DESC) AS dense_rank_order,
ROW_NUMBER() OVER (ORDER BY price DESC) AS row_number_order
FROM products;
| name | price | rank_order | dense_rank_order | row_number_order |
|---|---|---|---|---|
| Delta TV | 1200.00 | 1 | 1 | 1 |
| Epsilon TV | 1200.00 | 1 | 1 | 2 |
| Alpha Phone | 899.00 | 3 | 2 | 3 |
| Beta Phone | 899.00 | 3 | 2 | 4 |
| Gamma Phone | 750.00 | 5 | 3 | 5 |
| Zeta Speaker | 299.00 | 6 | 4 | 6 |
products 테이블에 수량(stock_quantity) 컬럼이 있다고 가정하고, 이를 기준으로 순위를 매겨봅니다.
SELECT name, stock_quantity,
RANK() OVER (ORDER BY stock_quantity DESC) AS stock_rank,
DENSE_RANK() OVER (ORDER BY stock_quantity DESC) AS stock_dense_rank,
ROW_NUMBER() OVER (ORDER BY stock_quantity DESC) AS stock_rownum
FROM products;
| name | stock_quantity | stock_rank | stock_dense_rank | stock_rownum |
|---|---|---|---|---|
| Zeta Speaker | 500 | 1 | 1 | 1 |
| Gamma Phone | 400 | 2 | 2 | 2 |
| Beta Phone | 300 | 3 | 3 | 3 |
| Alpha Phone | 300 | 3 | 3 | 4 |
| Delta TV | 150 | 5 | 4 | 5 |
| Epsilon TV | 100 | 6 | 5 | 6 |
이 3개의 함수는 기준 컬럼과 ORDER BY 조건이 같아도 결과가 다릅니다.
특히 동점 처리 방식과 행 건너뛰기 여부에 따라 결과 해석이 달라지므로,
용도에 맞는 함수를 사용하는 것이 중요합니다.
다음 포스팅에서는 PARTITION BY, ORDER BY, ROWS/RANGE에 대해서 알아보겠습니다! 그럼 👋