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)는?
반응형
'DataBase > Oracle' 카테고리의 다른 글
[ORACLE]최대값, 최소값 구하는 GREATEST, LEAST 함수 (0) | 2021.06.04 |
---|---|
[ORACLE]조건문을 제공하는 DECODE 함수 (0) | 2021.06.03 |
[ORACLE]DUMP 함수 (0) | 2021.05.21 |
[ORACLE]날짜에서 특정 값 추출, EXTRACT 함수 (0) | 2021.05.20 |
[ORACLE]특정일 다음의 날짜 NEXT_DAY 함수 (0) | 2021.05.18 |
댓글