본문 바로가기
Skills/SQL

[SQL] 순위 함수 : RANK, DENSE_RANK, ROW_NUMBER

by 602yu 2024. 4. 24.

 

 

RANK(), DENSE_RANK(), ROW_NUMBER() 는 셋 다 순서에 따라 랭킹을 만들어 주는 함수입니다.

 

 

 

1. RANK( )

 

사용법


RANK() OVER (ORDER BY column_name DESC/ASC)

 

 

> 특징

  • 동일한 값이 있을 때 같은 순위를 할당하고 중간 순위를 건너뜁니다.
  • 중복된 값이 있을 경우, 같은 순위를 가지게 됩니다.

RANK() 뒤에 OVER 다음에 나오는 괄호에 안에 출력하고 싶은 데이터를 정렬하는 SQL 문장을 넣으면 그 컬럼 값에 대한 데이터의 순위가 출력됩니다. 또한 오름차순, 또는 내림차순에 대한 옵션을 사용자가 설정할 수 있습니다.

 

 

 

 

2. DENSE_RANK( )

 

사용법


DENSE_RANK() OVER (ORDER BY column_name DESC/ASC)

 

 

> 특징

  • 중복된 값이 있어도 중간 순위를 건너뛰지 않고 순차적인 순위를 할당합니다.
  • 중복된 값이 있을 경우, 같은 순위를 가지게 됩니다.

데이터의 순위를 상세하게 출력하기 위해서 DENSE_RANK 함수를 사용합니다.

 

 

 

3. ROW_NUMBER( )

 

사용법


ROW_NUMBER() OVER (ORDER BY column_name)

 

 

 

> 특징

  • 각 행에 고유한 숫자를 할당합니다.
  • 중복된 값이 있더라도 항상 고유한 값을 할당합니다.

 

 

 

예제

 - member 테이블에서 각 회원의 이름(mem_name)과 키(height)에 따른 순위를 계산

SELECT mem_name,
	height,
	RANK() OVER(ORDER BY height DESC) AS 'RANK',
    DENSE_RANK() OVER(ORDER BY height DESC) AS 'DENSE_RANK',
    ROW_NUMBER() OVER(ORDER BY height DESC) AS 'ROW_NUMBER'
FROM member

 

 

 

결과를 살펴보면 RANK(), DENSE_RANK(), ROW_NUMBER() 함수 각각의 동작 방식을 쉽게 확인할 수 있습니다.

 

  • RANK() :  2위가 두 명이 동시에 같은 순위를 가지고 있으므로 그 다음 순위인 3위는 건너뛰고 4위로 할당되었습니다.
  • DENSE_RANK() :  중복된 순위 2위가 있더라도 중간 순위를 건너뛰지 않고 연속적인 순위가 부여되었습니다.
  • ROW_NUMBER() : 중복된 값이 있더라도 2위, 3위로 각 행에 고유한 번호가 부여되었습니다. 

 

 

4. PARTITION_BY 

PARTITION BY 절을 사용하면 RANK(), DENSE_RANK(), ROW_NUMBER() 함수를 더 세분화하여 그룹별로 순위를 할당할 수 있습니다. 이를 통해 그룹별로 나누어 각 그룹 내에서 순위를 매길 수 있습니다.

SELECT addr, 
	height,
	RANK() OVER(PARTITION BY addr ORDER BY height DESC) AS 'RANK',
    DENSE_RANK() OVER(PARTITION BY addr ORDER BY height DESC) AS 'DENSE_RANK',
    ROW_NUMBER() OVER(PARTITION BY addr ORDER BY height DESC) AS 'ROW_NUMBER'
FROM member
ORDER BY addr

 

=> 위의 쿼리는 member 테이블에서 주소(addr)별로 그룹을 만들어 각 그룹 내에서 회원들의 키(height)에 따른 순위를 계산합니다. 


 


정리하자면 세 함수는, 

  • RANK(): 동일한 값에 대해 같은 순위가 필요한 경우에 사용됩니다.
  • DENSE_RANK(): 중복된 값에 상관 없이 연속적인 순위가 필요한 경우에 사용됩니다.
  • ROW_NUMBER(): 각 행을 유일하게 식별하고 싶을 때 사용됩니다.

이렇게 순위 함수를 사용하면 데이터의 순서에 따라 순위를 계산할 수 있습니다. 각 함수는 데이터의 특성에 따라 적합한 순위 계산 방식을 제공하므로, 사용 시에 주의하여 선택해야 합니다.