본문 바로가기
Programming/SQL

RANK(), DENSE_RANK(), NTILE() 함수 사용하기

by 제타 2018. 5. 19.
반응형

지난 포스팅에서 ROW_NUMBER() OVER(PARTITION BY ~ ORDER BY ~) 를 활용하여 랭킹을 매겼었다.

이번 시간에는 RANK(), DENSE_RANK(), NTILE()를 활용하여 랭킹을 매겨보자.


보통 우리가 순위를 매길 때 공동 점수가 있으면 누적 순위를 할 것인지 그냥 할 것인지를 정해야되는데 이번 시간에 쿼리로 짜는 방법을 설명하려고 한다



CREATE TABLE score_tbl( seq INT, team_cd int, name VARCHAR(30), score INT )


GO 



INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 1,  10, '호날두', 97 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 2,  20, '메시', 20 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 3,  30, '파브레가스', 28 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 4,  10, '피구', 19 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 5,  20, '알베스', 29 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 6,  10, '페페', 53 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 7,  30, '아자르', 59 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 8,  40, '제코', 97 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 9,  20, '이니에스타', 89 )

INSERT INTO score_tbl(seq, team_cd, name, score) VALUES ( 10, 20, '사비', 49 )


1. ROW_NUMBER()

SELECT seq, team_cd, name, score, ROW_NUMBER() OVER (ORDER BY score DESC) AS '등수' FROM score_tbl


2. RANK()

SELECT seq, name, score, RANK() OVER (ORDER BY score DESC) AS '등수' FROM score_tbl



호날두와 제코가 공동 1위이기 때문에 이니에스타가 3등이다. (2등이 아니다)



3. DENSE_RANK()

SELECT seq, name, score, DENSE_RANK() OVER (ORDER BY score DESC) AS '등수' FROM score_tbl


DENSE를 사용하면 이니에스타가 3등으로 바로 넘어가지 않고 2등이 된다.


4. NTILE

SELECT seq, name, score, NTILE(3) OVER (ORDER BY score DESC) AS '등분' FROM score_tbl


이렇게 NTILE을 활용하면 등분하여 순위를 매길 수 있다. 예를 들어 NTILE(3)이므로 상,중,하 이고 

NTILE(2)를 하면 상위 50%, 하위 50% 이런식으로 나온다.




총 정리를 하면 다음과 같다.


-- ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE() 의 차이점

SELECT seq, name, team_cd, score,

           ROW_NUMBER() OVER (ORDER BY score DESC) AS 'ROW_NUMBER',

           RANK() OVER (ORDER BY score DESC) AS 'RANK',

           DENSE_RANK() OVER (ORDER BY score DESC) AS 'DENSE_RANK',

           NTILE(3) OVER (ORDER BY score DESC) AS 'NTITLE'

FROM score_tbl



반응형