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

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

 

목차
  1. 순번 매기기
  2. 그룹별 순번 매기기
  3. 정렬 사용 시 주의사항

 

순번 매기기

SELECT ename
     , job
     , sal
     , ROW_NUMBER() OVER(ORDER BY sal DESC) AS rownum
  FROM emp
 WHERE job IN ('MANAGER', 'SALESMAN')

 

 

ROW_NUMBER 함수는 분석 함수이기 때문에 OVER 절과 함께 사용해야 한다.

OVER 절 내부 ORDER BY 절에 순번을 매길 기준 칼럼을 작성하면 된다.

 

SELECT 절에 ORDER BY를 작성하지 않아도, OVER 절 내부의 ORDER BY 절의 정렬 칼럼 기준으로 데이터가 정렬된 후 데이터가 조회된다.

 

정렬(ORDER BY) 없이 순번 매기기

SELECT ename
     , job
     , sal
     , ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rownum
  FROM emp
 WHERE job IN ('MANAGER', 'SALESMAN')

 

 

OVER 절 내부에 ORDER BY 절을 작성하지 않으면 아래와 같은 오류가 발생한다.

 

"ROW_NUMBER" 함수에는 ORDER BY가 포함된 OVER 절이 있어야 합니다.

 

정렬 기준을 부여하지 않고 순번을 매기기 위해서는 ORDER BY  절에 SELECT 1과 같은 의미 없는 값을 부여하여 원 데이터가 조회된 기준으로 순번을 매길 수 있다.

 

위의 방법은 정상적인 방법은 아니며 특수한 경우에 사용할 수 있는 팁 같은 쿼리문이다.

 

그룹별 순번 매기기

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

 

 

OVER 절에 PATITION BY 절을 사용하여 그룹별로 순번을 매길 수 있다.

 

정렬 사용 시 주의사항

SELECT ename
     , job
     , sal
     , ROW_NUMBER() OVER(ORDER BY sal DESC) AS rownum
  FROM emp
 WHERE job IN ('MANAGER', 'SALESMAN')
 ORDER BY ename

 

 

OVER 절을 사용할 경우 OVER 절 내부의 ORDER BY 절의 칼럼으로 정렬 후 데이터가 조회되지만, SELECT 절에 추가로 ORDER BY 절을 사용할 경우 최종 정렬은 SELECT 절의 ORDER BY 절 기준으로 조회된다.

 

위의 예시는 OVER 절 내부의 ORDER BY 절 기준으로 정렬 후 순번을 매겨졌지만, SELECT 절에 ORDER BY 절의 ename 칼럼으로 다시 정렬되었기 때문에 순번 순서로 조회되지 않는다.

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

 

[MSSQL] ROWNUM 사용법 정리 (조회 순번)

SQL Server에서는 오라클에서 사용하는 ROWNUM은 사용할 수 없다. 그러나 TOP과 ROW_NUMBER 함수를 사용하여 비슷한 결과를 만들 수 있다. ROWNUM은 주로 아래의 2가지 경우에 많이 사용한다. ​ 조회 개수

gent.tistory.com

 

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

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

gent.tistory.com

 

댓글

Designed by JB FACTORY