DataBase/Oracle

[ORACLE]순위 표현하는 RANK함수

DevStory 2021. 5. 22.

RANK Function

RANK 함수는 조회된 결과에 대해 순위를 지정합니다.

값이 중복되는 경우 동일한 순위를 나타내며, 다음 순위의 값은 중복되는 개수만큼 증가된 값입니다.


1. 분석함수로 사용

RANK() OVER ( [ query_partition_clause] ORDER BY clause )

 

분석 함수로 사용되는 RANK 함수는 쿼리의 각 행에 대한 순위를 다른 행과 함께 반환합니다.

GROUP BY를 하지 않아도 순위를 확인할 수 있습니다.


EX 1) 파티션을 생략한 SCORE에 대한 순위

CREATE TABLE TEST_TABLE
( 
    ID     VARCHAR2(4000 BYTE), 
    NAME   VARCHAR2(200 BYTE), 
    SCORE  NUMERIC(17, 4) 
); 

INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 1000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('3', 'Bill', 3000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('4', 'Greg', 3000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('5', 'Steve', 3000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('6', 'Johhny', 4000);

[기준 데이터]

 

SELECT ID
     , NAME
     , SCORE
     , RANK() OVER(ORDER BY SCORE) AS SCORE_RANK
FROM TEST_TABLE;

SCORE가 동일한 ROW에 대해서는 동일한 순위로 지정합니다.

그다음 순위는 4가 아니라 중복되고 있는 순위(3) + 중복된 개수(3)이므로 6입니다.

 

EX 2) 파티션 적용하여 각 ID별로 SCORE에 대한 순위

CREATE TABLE TEST_TABLE
( 
    ID     VARCHAR2(4000 BYTE), 
    NAME   VARCHAR2(200 BYTE), 
    SCORE  NUMERIC(17, 4) 
); 

INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 1000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 3000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 4000); 

INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 1000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 3000); 

[기준 데이터]

 

SELECT ID
     , NAME
     , SCORE
     , RANK() OVER(PARTITION BY ID ORDER BY SCORE) AS SCORE_RANK
FROM TEST_TABLE
ORDER BY ID, SCORE;

PARTITION BY를 적용하여 ID별로 점수에 대한 순위를 적용하였습니다.

 

설명

1. 조회된 결과에 대해 ID별로 PARTITION BY 처리를 했을 때

2. SCORE의 값을 정렬했을 때 순위(RANK)는?

 


2. 집계 함수로 사용

RANK( expr1 [, expr2, ... expr_n ] ) WITHIN GROUP ( ORDER BY expr1 [, expr_2, ... expr_n ] )

집계 함수로 사용되는 RANK 함수는 GROUP BY 처리된 행에 대해 입력된 값의 순위를 알 수 있습니다.


EX 1) ID를 GROUP BY 한 결과에 대해 각 ID에 대해 SCORE 3000의 순위

CREATE TABLE TEST_TABLE
( 
    ID     VARCHAR2(4000 BYTE), 
    NAME   VARCHAR2(200 BYTE), 
    SCORE  NUMERIC(17, 4) 
); 

INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 1000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('1', 'John', 3000); 

INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 1000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 2000); 
INSERT INTO TEST_TABLE (ID, NAME, SCORE) VALUES ('2', 'Mike', 3000); 

[기준 데이터]

 

SELECT ID
     , MAX(NAME) AS NAME
     , RANK(3000) WITHIN GROUP (ORDER BY SCORE) AS SCORE_RANK
FROM TEST_TABLE
GROUP BY ID;

설명

1. ID 별로 GROUP BY 처리된 결과에 대해서

2. SCORE의 값을 정렬했을 때

3. SCORE의 값이 3000인 데이터의 순위(RANK)는?

반응형

댓글