SQL Window Functions: RANK(), DENSE_RANK(), ROW_NUMBER()

하하호호훈이·2025년 6월 2일

SQL(MySQL) MUST KNOW

목록 보기
22/23
post-thumbnail

이번 포스팅에서는 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 테이블

컬럼명타입설명
idINT제품 ID (기본 키)
nameVARCHAR(50)제품 이름
categoryVARCHAR(50)제품 카테고리
priceDECIMAL(10,2)제품 가격
stock_quantityINT재고 수량

예제 1: 전 제품 가격 기준 순위 매기기

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;

예시 결과:

namepricerank_orderdense_rank_orderrow_number_order
Delta TV1200.00111
Epsilon TV1200.00112
Alpha Phone899.00323
Beta Phone899.00324
Gamma Phone750.00535
Zeta Speaker299.00646

예제 2: 제품 수량 기준 순위 매기기

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;

결과:

namestock_quantitystock_rankstock_dense_rankstock_rownum
Zeta Speaker500111
Gamma Phone400222
Beta Phone300333
Alpha Phone300334
Delta TV150545
Epsilon TV100656

결론

  • 이 3개의 함수는 기준 컬럼과 ORDER BY 조건이 같아도 결과가 다릅니다.

  • 특히 동점 처리 방식과 행 건너뛰기 여부에 따라 결과 해석이 달라지므로,
    용도에 맞는 함수를 사용하는 것이 중요합니다.


다음 포스팅에서는 PARTITION BY, ORDER BY, ROWS/RANGE에 대해서 알아보겠습니다! 그럼 👋

profile
AI, Data Science/Analysis 리뷰용가리지용 😆

0개의 댓글