지난 포스팅에서 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
'Programming > SQL' 카테고리의 다른 글
ROW 펼치기 팁 - 쿼리로 행(세로)을 열(가로)로 펼치는 방법 (4) | 2018.05.25 |
---|---|
ROW_NUMBER() 사용 방법 - 순위를 매겨보자 (0) | 2018.05.18 |
데이터 정규화 (제 1차~5차 정규화) (0) | 2018.04.24 |
CREATE TABLE, ALTER TABLE ( 컬럼 추가,삭제,변경 등) 방법 (0) | 2018.04.22 |
CREATE DATABASE 데이터베이스 생성하기 (0) | 2018.04.22 |