반응형

 

데이터들을 그룹화시켜, 순서를 매기는 방법이 3가지가 있다.

  • ROW_NUMBER
  • RANK
  • DENSE_RANK

역시나 3가지가 있는 것으로 보아, 3가지 모두 다른 성격의 랭크 함수라고 생각이 든다.

샘플을 통해서 테스트를 해보면서 어떠한점이 다른지 확인해보자.

 

예제

테이블 생성

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE #MEMBER(
    num        INT,
    name    NVARCHAR(20),
    score    INT
)
 
INSERT INTO #MEMBER (num, name, score) VALUES(1'홍길동'90);
INSERT INTO #MEMBER (num, name, score) VALUES(2'고길동'85);
INSERT INTO #MEMBER (num, name, score) VALUES(3'피카츄'83);
INSERT INTO #MEMBER (num, name, score) VALUES(4'파이리'85);
INSERT INTO #MEMBER (num, name, score) VALUES(5'꼬북이'80);
cs

테이블 예제

 

SELECT QUERY

1
2
3
4
5
6
7
SELECT  ROW_NUMBER() OVER(ORDER BY score DESC) AS 'ROW_NUMBER',
        DENSE_RANK() OVER(ORDER BY score DESC) AS 'DENSE_RANK',
        RANK() OVER(ORDER BY score DESC) AS 'RANK',
        num,
        name,
        score
FROM #MEMBER
cs

SELECT 결과

결과를 보면서 확인해보자. 우리는 num 값인 2/4 번을 유념해야 한다.

그 이유는 중복된 점수일때 비교를 하기 위함이 가장 중요 포인트이다.

  • ROW_NUMBER 는 중복 허용없이 1~5위까지 나온다. 무조건 순위를 나눈다는 것이다.
  • 중복된 점수일때에는, num값이 작은 것이 우선 순위를 두었다.
  • DENSE_RANK 는 동일한 점수는 같은 순위를 매긴다.
  • 그리고 공동2등 2명이다. 그 다음 순위는 4위가 아니라 3위라는 것을 명심하자.
  • RANK 도 DENSE_RANK 와 동일하게 동일한 점수는 같은 순위를 매긴다.
  • 그리고 공동2등이 2명이기에, 그 다음은 4위이다.

 

정리

정리한다면 ROW_NUMBER는 중복을 허용하지 않고, DENSE_RANK/RANK 는 중복을 허용한다는 것이다.

DENSE_RANK/RANK의 차이점은 DENSE_RANK는 공동등수는 하나의 등수로 보고 다음 등수를 매기지만, RANK는 공동등수를 모두 포함시키고 다음 등수를 매긴다.

함수들 마다 성격이 다르기 때문에, 이점을 유념하면서 알맞은 함수를 선택하자.

 

반응형

+ Recent posts