반응형
데이터들을 그룹화시켜, 순서를 매기는 방법이 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 |
결과를 보면서 확인해보자. 우리는 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는 공동등수를 모두 포함시키고 다음 등수를 매긴다.
함수들 마다 성격이 다르기 때문에, 이점을 유념하면서 알맞은 함수를 선택하자.
반응형
'개발 > MSSQL' 카테고리의 다른 글
[SQL] CASE WHEN, 데이터 형식 변환 오류 해결 방법 (2) | 2020.01.02 |
---|---|
[SQL] 동적쿼리를 사용해보자 (feat.SP_EXECUTESQL) (0) | 2019.12.04 |
[SQL] 쿼리를 잠깐 멈췄다 실행해보자.(feat. sleep / wait / delay) (0) | 2019.12.04 |
[SQL] IDENTITY 자동증가되는 값을 바꿔보자. (0) | 2019.12.04 |
[SQL] 인덱스(Index)을 알아야 정확한 실행계획을 알수있다 (0) | 2019.12.04 |