오라클 row_number RANK - olakeul row_number RANK

개발/DB

오라클(oracle) rank(), row_number() 순위함수 사용 예제

Mr.mandu 2019. 11. 13. 11:28

안녕하세요.

오늘은 오라클 함수에 대해 설명하고자 합니다.

오라클 뿐만 아니라 mssql에서도 사용이 가능 합니다.

mysql, postgre 등의 다른 DB는 확인해보셔야 할 것 같습니다.

순위를 뽑아내는 rank() 함수에 대해 알아보겠습니다.

이런 함수는 알아둬야 나중에 검색이라도 해서 활용 할 수 있습니다.

기본 랭크 함수입니다.

구분을 위해 쿼리는 파란 네모 표시로 하겠습니다.

rank() 함수

select sno, cost, rank() over(order by nvl(cost,0) desc) rank from pt_02;

<결과>

오라클 row_number RANK - olakeul row_number RANK

cost가 null값이면 0으로 처리하였습니다.

또한 내림차순으로 정렬하였습니다.

rank 출력문을 보시면 1,2,3,4,5,5,7 로 출력되는것을 볼 수 있는데

cost 값이 500으로 똑같기 때문입니다.

여기서 순위가 7이 아닌 6으로 처리하기위한 함수가 있는데

dense_rank() 입니다.

dense_rank() 함수

select sno, cost, dense_rank() over(order by nvl(cost,0) desc) rank from pt_02;

<결과>

rank 출력문을 보시면 1,2,3,4,5,5,6 으로 출력된 모습을 확인 할 수 있습니다.

이번에는 지역별(분류) 순위를 출력해 보겠습니다.

지역별 가격 순위

select 

sno, no, count, cost, location,

rank() over(PARTITION by location order by  nvl(cost,0) desc ) as rank

from pt_02;

<결과>

'partition by 컬럼' 을 통해 지역별 순위를 출력하였습니다.

 위의 결과를 보시면 4순위가 2개로 출력됩니다.

구분을 주기위하여 sno 번호로 정렬을 한번더 주겠습니다.

select 

sno, no, count, cost, location,

rank() over(PARTITION by location order by  nvl(cost,0) desc, sno desc ) as rank

from pt_02;

<결과>

sno로 정렬을 주어 동일 순위를 제거하였습니다.

rank 기능과 유사하게 사용할 수 있는 row_number()가 있습니다.

row_number()는 따로 순위를 매긴다기보다 순번을 정한다는 개념입니다.

rowId와 비슷합니다.

row_number()

select 

sno, no, count, cost, location,

row_number() over( order by  nvl(cost,0) desc ) as rank

from pt_02;

<결과>

row_number()도 partition by 를 사용하여 지역별 순번을 할당 할 수 있습니다.

select 

sno, no, count, cost, location,

row_number() over( partition by location  order by  nvl(cost,0) desc ) as rank

from pt_02;

<결과>

이러한 함수들을 익히기위해 

실습을 통해 포스팅 할 예정입니다.

감사합니다.

ORACLE/SQL

[Oracle] ROW_NUMBER, RANK, DENSE_RANK 함수 순위 매기기 :: 마이자몽

🌻♚ 2020. 3. 29. 07:20

사원들의 급여를 많이 받는 순서대로 순위를 출력하시오.

ORACLE SCOTT 계정의 EMPLOYEES 테이블을 이용해서 출력한 결과입니다.

오라클 row_number RANK - olakeul row_number RANK

순서를 매기는 방법에는 여러가지 방법이 있습니다. 분석함수를 사용하지 않는다면 아래처럼 구할것 입니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

SELECT 

EMPNO

,ENAME 

,SAL

,DEPTNO

,ROWNUM AS RNK

FROM

(

SELECT 

* 

FROM 

EMP 

ORDER BY SAL DESC

);

SELECT 절은 ORDER BY 이전에 실행되기 때문에 SUBQUERY를 이용해서 순위를 매길수 있습니다. 전체 순위중 일부를 출력하기 위해서는 TOP-N쿼리나 ROW LIMIT CLAUSE를 사용해서 출력이 가능합니다. 자세한 내용은 아래 링크를 참조!

[Oracle] 오라클 페이징 쿼리 쉽게 만들기 Row Limiting Clause 사용 :: 마이자몽

오라클 페이징 오라클 데이터베이스 페이징 쿼리는 어떻게 작성할까요? 포털 사이트에서 검색을 했을 때, 게시판 형태의 웹사이트에서 결과를 볼때, 한번에 모든 결과를 볼 수 없기 때문에 페이징 처리를 하여 화..

myjamong.tistory.com

오라클 row_number RANK - olakeul row_number RANK

그럼 분석함수를 이용하면 어떨까요?

SELECT

EMPNO

,ENAME

,SAL

,DEPTNO

,ROW_NUMBER() OVER(ORDER BY SAL DESC) AS RNK

FROM EMP;

ROW_NUMBER함수를 사용해서 쉽게 구할 수 있습니다.

분석함수에는 순위를 매기기 위해 사용되는 함수가 3가지 있습니다. ROW_NUMBER(), RANK(), DENSE_RANK()  세개의 함수를 비교해서 어떤 차이가 있는지 알아봅시다.

ROW_NUMBER, RANK, DENSE_RANK 비교

오라클 row_number RANK - olakeul row_number RANK

위의 예제에서 ROW_NUMBER를 사용했을때, 중복에 대한 순위 처리는 없었습니다. 그냥 순서대로만 나열했습니다. 그런데 동일 값에 대해서 같은 순서로 출력하고 싶을때는 어떻게 해야할까요? 3가지 함수를 동시에 사용해서 비교해보겠습니다.

SELECT

EMPNO

,ENAME

,SAL

,DEPTNO

,ROW_NUMBER() OVER(ORDER BY SAL DESC) AS RN_RANK

,RANK() OVER(ORDER BY SAL DESC) AS RANK

,DENSE_RANK() OVER(ORDER BY SAL DESC) AS D_RANK

FROM EMP;

오라클 row_number RANK - olakeul row_number RANK

9, 10 ,11번 행을 확인해보면 각각 결과가 다른 것을 확인 할 수 있습니다.

오라클 row_number RANK - olakeul row_number RANK

ROW_NUMBER 함수

ROW_NUMBER 함수는 동일 값에 상관없이 순차적인 번호로 순위를 부여합니다.

RANK 함수

RANK 함수는 동일값에 대해서 같은 순위를 부여하고 다음 순위는 누적 순위로 출력합니다.

DENSE_RANK 함수

 DENSE_RANK 함수는 동일값에 대해서 같은 순위를 부여하고 다음 순위는 누적 시키지 않고 그대로 순차를 지킵니다.

PARTITION ORDER BY

SELECT

EMPNO

,ENAME

,SAL

,DEPTNO

,RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) AS RNK

FROM EMP;

오라클 row_number RANK - olakeul row_number RANK

분석함수를 사용하면, 각 그룹별로 순위를 매기는 작업을 간단한 쿼리로 출력이 가능합니다.

[Oracle] OVER ... PARTITION BY 분석절 ANALYTIC FUNCTION :: 마이자몽

사원 정보를 입력하는데, 전체 급여 평균값과 함께 출력하시오. ORACLE SCOTT 계정 EMP 테이블로 출력된 결과입니다. 위 문제를 풀기 위해 어떻게 쿼리를 작성하실건가요? 1 2 3 4 5 6 7 8 SELECT DEPTNO ,EMPNO..

myjamong.tistory.com

오라클 row_number RANK - olakeul row_number RANK

RANK 예측 WITHIN GROUP

SELECT

RANK(2975) WITHIN GROUP (ORDER BY SAL DESC) AS RNK

,DENSE_RANK(2975) WITHIN GROUP (ORDER BY SAL DESC) AS D_RNK

FROM EMP;

오라클 row_number RANK - olakeul row_number RANK

RANK와 DENSE_RANK함수에 인자를 넣어주면 해당 값이 범위에 있다면 몇등인가?를 확인할 수 있습니다.