본문 바로가기
㏈ª By β┖υΕJini/MS-SQL

RANK 함수에 대해 정리 해보았습니다.

by ㏈ª ☞ β┖υΕJini.κR 2010. 11. 10.
사용자 삽입 이미지



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 매출통계