RANK() 함수에 대해서 한번 정리 해보았습니다.
-- 순위함수정리에대해서한번정리해보았습니다.
순위함수는 우리가 데이터를 입력한 순으로 순위를 정하는 것이 아니라
정렬한 순서대로 순위를 정하게 됩니다.
USE TESTDB
GO
CREATE TABLE 성적( 번호 INT, 이름 CHAR(8), 점수 INT )
GO
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 1, '김경진', 79 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 2, '강산아', 19 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 3, '김희선', 29 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 4, '홍길동', 49 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 5, '고현정', 39 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 6, '하만철', 59 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 7, '김대우', 79 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 8, '강성욱', 69 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 9, '김민석', 99 )
INSERT INTO 성적(번호, 이름, 점수) VALUES ( 10, '티파니', 89 )
-- 점수에따른순위를구하는경우 ROW_NUMBER() 이용해서사용할수있습니다.
SELECT 번호, 이름, 점수, ROW_NUMBER() OVER (ORDER BY 점수 DESC) AS '등수' FROM 성적
-- 동일한점수의경우같은랭킹을정희할경우
-- 이렇게하면상관관계SUB QUERY를사용하지않아도손쉽게등수를정의할수있습니다.
SELECT 번호, 이름, 점수, RANK() OVER (ORDER BY 점수 DESC) AS '등수' FROM 성적
-- 중복되는값이있어도순위를건너뛰지않고순위를낼수있다.
SELECT 번호, 이름, 점수, DENSE_RANK() OVER (ORDER BY 점수 DESC) AS '등수' FROM 성적
-- 점수에따른부류NTITLE()
-- 성적상, 중, 하로구분할수있다
SELECT 번호, 이름, 점수, NTILE(3) OVER (ORDER BY 점수 DESC) AS '등분' FROM 성적
-- ROW_NUMBER(), RANK(), DENSE_RANK() 함수의차이점
SELECT 번호, 이름, 점수,
ROW_NUMBER() OVER (ORDER BY 점수 DESC) AS 'ROW_NUMBER',
RANK() OVER (ORDER BY 점수 DESC) AS 'RANK',
DENSE_RANK() OVER (ORDER BY 점수 DESC) AS 'DENSE_RANK',
NTILE(3) OVER (ORDER BY 점수 DESC) AS 'NTITLE'
FROM 성적
-- PARTITION BY 키워드사용, 매출
-- 년도별로매출에따른순위
CREATE TABLE 매출통계( 년도 INT, 분기 INT, 매출액 BIGINT )
GO
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2009, 1, 10000000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2009, 2, 11000000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2009, 3, 10200000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2009, 4, 10030000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2010, 1, 10004000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2010, 2, 10000500 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2010, 3, 10004000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2010, 4, 10030000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2011, 1, 10200000 )
INSERT INTO 매출통계(년도, 분기, 매출액) VALUES ( 2011, 2, 11000000 )
SELECT * FROM 매출통계
SELECT 년도, 분기, 매출액,
ROW_NUMBER() OVER (PARTITION BY 년도 ORDER BY 매출액 DESC) AS 'PARTITIONED'
FROM 매출통계