[MSSQL] 순위 구하기 (RANK, DENSE_RANK 함수)

SQL Server에서 순위를 구하기 위해서는 RANK 함수, DENSE_RANK 함수를 사용하면 된다. 두 함수의 사용방법은 동일하지만 순번을 매기는 방법이 조금 차이가 있으니 주의해서 사용해야 한다. RANK, DENSE_RANK 함수는 분석함수이기 때문에 OVER절과 함께 사용해야 한다.

 

목차
  1. 순위 구하기
  2. 그룹별 순위 구하기
  3. 정렬(ORDER BY) 사용 시 주의사항

 

순위 구하기

RANK 함수 사용법

SELECT ename
     , sal
     , RANK() OVER(ORDER BY sal DESC) AS rank_sal
  FROM emp
 WHERE job IN ('ANALYST', 'SALESMAN')

 

 

순위함수는 OVER 절과 함께 사용해야 하며 OVER 절 내부의 ORDER BY 절에 순위 칼럼을 지정하면 된다.

 

예시에 1순위가 2명이기 때문에 2순위는 건너뛰고 다음 순위는 3순위가 부여된다. 동일한 순위가 있어도 순차적인 순위를 부여하고 싶다면 아래의 DENSE_RANK 함수를 사용하면 된다.

 

RANK()  : 중복 순위 개수만큼 다음 순위 값을 증가 시킴
DENSE_RANK() : 중복 순위가 존재해도 순차적으로 다음 순위 값을 표시함 

 

DENSE_RANK 함수 사용법

SELECT ename
     , sal
     , DENSE_RANK() OVER(ORDER BY sal DESC) AS rank_sal
  FROM emp
 WHERE job IN ('ANALYST', 'SALESMAN')

 

 

DENSE_RANK 함수는 앞에 동일한 순위가 부여되었어도 순차적인 순위를 부여한다.

 

상세한 순위를 구하는 방법

SELECT ename
     , sal
     , comm
     , RANK() OVER(ORDER BY sal DESC, comm DESC) AS rank_sal
  FROM emp
 WHERE job IN ('ANALYST', 'SALESMAN')

 

 

조금 더 상세한 순위를 부여하고 싶을 때는 ORDER BY 절에 추가적인 순위 칼럼을 부여하면 된다.

예시에 급여(sal)는 동일하지만 커미션(comm) 칼럼을 값까지 판단하여 서로 다른 순위를 부여한 것을 확인할 수 있다.

 

그룹별 순위 구하기

SELECT ename
     , job
     , sal
     , RANK() OVER(PARTITION BY job ORDER BY sal DESC) AS rank_sal
  FROM emp
 WHERE job IN ('MANAGER', 'SALESMAN')

 

 

OVER 절 내부에 PARTITION BY 절을 사용해서 그룹별로 순위를 부여할 수 있다.

그룹별로 1부터 순차적으로 순위를 부여하며, 그룹이 바뀌면 다시 1부터 순위를 부여한다.

 

SELECT ename
     , job
     , sal
     , DENSE_RANK() OVER(PARTITION BY job ORDER BY sal DESC) AS rank_sal
  FROM emp
 WHERE job IN ('MANAGER', 'SALESMAN')

 

 

정렬(ORDER BY) 사용 시 주의사항

 

OVER 절에서 ORDER BY 절을 사용하면, SELECT 절에 ORDER BY를 사용하지 않아도 OVER 절 내부의 정렬 조건으로 데이터가 자동으로 정렬된다.

 


 

SELECT 절에 ORDER BY 절을 사용할 경우 최종 정렬은 SELECT 절의 정렬기준으로 조회된다.

순위별로 정렬되지 않았지만 순위 값은 정확한 것을 확인할 수 있다.

예제쿼리(테이블포함).txt
0.00MB

 

[MSSQL] 순번 매기기 (ROW_NUMBER 함수)

SQL Server에서 조회된 데이터에 순번을 매기기 위해서는 ROW_NUMBER 함수를 사용하면 된다. ROW_NUMBER 함수는 분석 함수이기 때문에 OVER 절과 함께 사용해야 한다. ROW_NUMBER 함수와 비슷한 순위를 구할

gent.tistory.com

 

댓글

Designed by JB FACTORY