오늘은 오라클에서 자주 쓰이는 순위 함수들에 대해서
정리를 해보려고 합니다.
Oracle에서는 쓰는 순위 함수는 여러가지가 있습니다.
그 중 대표적으로 많이 사용되는 것은 3가지가 있습니다.
ROW_NUMBER, RANK, DENSE_RANK
이렇게 3개를 대표적으로 사용하고 있습니다.
오늘은 이 3가지 함수들에 대해서
사용방법, 차이점 등을 정리해보도록 하겠습니다.
1. 테스트용 데이터
우선 이번 순위 함수 사용법에 대해서
사용하기 위하여 임시데이터를 생성해보도록 하겠습니다.
기초용 임시테이블을 생성하고,
임시데이터를 넣어서 테스트를 해보도록 하겠습니다.
아래 쿼리를 이용하여 임시테이블을 생성하였습니다
CREATE TABLE TMP_EMP (
ID NUMBER PRIMARY KEY,
EMP_NAME VARCHAR2(50),
TEAM VARCHAR2(50),
AGE NUMBER
);
위 쿼리를 이용하여 임시테이블을 생성하였고,
이제는 임시 데이터도 넣어보도록 하겠습니다
INSERT INTO TMP_EMP VALUES (1, '홍길동', '인사팀', '35');
INSERT INTO TMP_EMP VALUES (2, '홍길순', '인사팀', '30');
INSERT INTO TMP_EMP VALUES (3, '김철수', '인사팀', '27');
INSERT INTO TMP_EMP VALUES (4, '박말순', '총무팀', '38');
INSERT INTO TMP_EMP VALUES (5, '김꽃님', '총무팀', '31');
INSERT INTO TMP_EMP VALUES (6, '이강남', '총무팀', '31');
INSERT INTO TMP_EMP VALUES (7, '나홍대', '총무팀', '27');
위 쿼리를 이용하여 데이터를 넣었습니다.
그냥 임시로 쓰기 위해서 아무렇게나 데이터를 만들어서
insert를 진행하였습니다.
그리고 insert 한 데이터가 정상적으로 들어가졌는지
확인해보도록 하겠습니다.
SELECT * FROM TMP_EMP
;
위 쿼리를 이용하여 데이터를 조회해보도록 하겠습니다.
임시테이블에 데이터가 잘 들어가있는지 그냥 보는 것입니다.
위처럼 쿼리를 작성하였고,
실행을 하면 아래처럼 나오게 됩니다.
위처럼 데이터가 정상적으로 잘 들어가져있는 것을
확인할 수 있습니다.
2. ROW_NUMBER
그럼 이제 순위 함수에 대해서
진짜로 확인해보도록 하겠습니다.
우선 첫번째로 확인할 함수는 ROW_NUMBER 함수입니다.
해당 함수는 그냥 순번을 나타내 주는 것입니다.
해당 파티션 안에서 순차적으로 증가하는 순번을 나타내 주는 것입니다.
실제 예제를 통해 확인해보도록 하겠습니다.
SELECT EMP_NAME, EMP_NAME, TEAM, AGE,
ROW_NUMBER() OVER (PARTITION BY TEAM ORDER BY AGE DESC) AS ROW_NUM
FROM TMP_EMP
ORDER BY TEAM, AGE DESC
;
위처럼 쿼리를 작성하였습니다.
팀을 기준으로 해서 각 팀에서 나이순으로 정렬을 하고,
나이순으로 순위를 설정하는 것입니다.
위처럼 쿼리를 작성하였고,
실행을 하게 되면 결과는 아래처럼 나오게 됩니다.
위처럼 나와지는 것을 볼 수가 있습니다.
인사팀, 총무팀으로 해서 나눠져 있고,
나이순으로 해서 정렬이 되어서 나오는 것을 볼 수가 있습니다.
3. RNAK 함수
이번에는 RANK 함수에 대해서 확인을 해보도록 하겠습니다.
ROW_NUMBER 함수의 경우에는 그냥 순차적으로 증가가 되는 것입니다.
만약 동일한 나이가 있어도 1,2,3,4 이런 식으로 증가가 됩니다.
하지만 RNAK 함수의 경우에는 동일한 나이가 있으면 순위가 같게 되고,
그 다음 순위는 넘어가게 되는 것입니다.
1,2,2,4 이런 식으로 나오게 하는 함수인 것입니다.
이제 실제 예제를 통해 확인해보도록 하겠습니다.
저는 아래처럼 쿼리를 작성하였습니다.
SELECT EMP_NAME, EMP_NAME, TEAM, AGE,
RANK() OVER (PARTITION BY TEAM ORDER BY AGE DESC) AS RANK
FROM TMP_EMP
ORDER BY TEAM, AGE DESC
;
위처럼 쿼리를 작성하였습니다.
ROW_NUMBER과 거의 동일한 쿼리이며,
함수만 다르게 설정을 한 것입니다.
위처럼 이렇게 쿼리를 작성하였고,
실행을 하게 되면 결과는 아래처럼 나오게 됩니다.
위처럼 나오게 됩니다.
총무팀에서 보면 31살인 사람이 2명이다보니
랭킹 2위가 2명이고, 그 다음이 4로 나오게 되는 것입니다.
4. DENSE_RANK
이번에는 DENSE_RANK 함수에 대해서 정리를 해보도록 하겠습니다.
DENSE_RANK 함수의 경우에는 RNAK와 또 약간 다릅니다.
RANK의 경우에는 1,2,2,4 로 나왔다면
DENSE_RANK의 경우에는 1,2,2,3으로 나오게 되는 것입니다.
RANK의 경우에는 순위가 건너띄기가 되는 것이라면,
DENSE_RANK 경우에는 순위가 연속적으로 지정이 되는 것입니다.
이제 실제 예제를 통해 확인해보도록 하겠습니다.
저는 쿼리를 아래처럼 작성하였습니다.
SELECT EMP_NAME, EMP_NAME, TEAM, AGE,
DENSE_RANK() OVER (PARTITION BY TEAM ORDER BY AGE DESC) AS DENSE_RANK
FROM TMP_EMP
ORDER BY TEAM, AGE DESC
;
위처럼 작성하였습니다.
RANK와 마찬가지로,
RANK 자리에 DENSE_RANK 만 변경한 동일한 쿼리입니다.
위처럼 쿼리를 작성하였고,
실행을 하게 되면 결과는 아래처럼 나오게 됩니다.
위처럼 나오게 됩니다.
제가 말했던 것처럼 총무팀에서 1,2,2,3으로 나와지는 것을
확인할 수 있습니다.
5. 한번에 확인하기
이번에는 위 3개의 함수를 한번에 확인하는 방법에 대해서
정리를 해보도록 하겠습니다.
별다르게 할 필요 없이 그냥 함수를 넣어주시면 되십니다.
서브쿼리들로 구성이 된 것이기 때문에
그냥 넣고 실행을 해주시면 되십니다.
실제 예제로 확인해보도록 하겠습니다.
저는 아래처럼 쿼리를 작성하였습니다.
SELECT EMP_NAME, EMP_NAME, TEAM, AGE,
ROW_NUMBER() OVER (PARTITION BY TEAM ORDER BY AGE DESC) AS ROW_NUM,
RANK() OVER (PARTITION BY TEAM ORDER BY AGE DESC) AS RANK,
DENSE_RANK() OVER (PARTITION BY TEAM ORDER BY AGE DESC) AS DENSE_RANK
FROM TMP_EMP
ORDER BY TEAM, AGE DESC
;
위처럼 쿼리를 작성하였습니다.
그냥 기존에 썼던 함수들을 한버넹 다 넣은 것만 차이가 있을 뿐
동일한 쿼리입니다.
위처럼 쿼리를 작성하였고,
실행을 하게 되면 결과는 아래처럼 나오게 됩니다.
위처럼 각각의 함수로 실행을 했을 때의 결과를
한번에 확인할 수 있습니다.
이렇게 보니 세함수의 차이점이 한눈에 확 들어오는 것 같네요.
오늘은 오라클에서 랭킹을 구할 때 쓰는 함수들에 대해서
정리를 해보았습니다.
더 많은 함수들이 있을지 모르겠는데,
우선 저는 저 3가지 함수만 사용을 하며,
이것들로 충분하더라고요.
그래서 이렇게 ROW_NUMBER, RANK, DENSE_RANK 함수에 대해서만
알고 있어도 충분할 것 같습니다.
앞으로 일을 하시거나, 공부를 하시거나,
사용을 하실 때 차이점을 정확하게 알고 사용을 하면 좋을 것 같습니다.
이상으로 오라클에서 사용하는 순위를 구하는 함수들이였습니다~
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
'컴퓨터관련 > Oracle' 카테고리의 다른 글
[Oracle]오라클 계층형 쿼리 (0) | 2025.04.22 |
---|---|
[Oracle]오라클에서 쿼리로 테이블정의서 추출하기 (0) | 2024.12.03 |
[Oracle]오라클에서 특정 컬럼이 포함된 테이블 찾기 (0) | 2024.09.19 |
[ORACLE]오라클에서 프로시저, 패키지 등 깨졌는지 확인 및 조치방법 (5) | 2024.08.28 |
[Oracle]오라클 쿼리 실행 시 바인드변수 이용하기 (0) | 2024.08.07 |