Database/Oracle

[Oracle]RANK() OVER()와 ROW_NUMBER() OVER

  • -
반응형


오라클에서는 순위를 반환해주는 함수로 RANK() OVER()와 ROW_NUMBER() OVER() 함수를 제공한다.

이 두 함수는 서로 차이가 있다.


RANK() OVER() / ROW_NUMBER() OVER()


사용 문법은 OVER안에 ORDER BY로 비교할 컬럼을 입력해주면 된다.

RANK() OVER( ORDER BY COLUMN ) 

이제 쿼리를 통해 확인해보자.


월드컵의 데이터가 담긴 테이블이 있고, 해당 승점(SCORE)에 따라 순위를 부여하고자 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH TESTDB AS(
    SELECT '스웨덴' NATION_NM, 3 PLAY, 2 WIN, 0 DRAW, 1 LOSE, '5/2' GAL, 3 GAP, 6 SCORE 
    FROM DUAL UNION ALL
    SELECT '멕시코' NATION_NM, 3 PLAY, 2 WIN, 0 DRAW, 1 LOSE, '3/4' GAL, -1 GAP, 6 SCORE 
    FROM DUAL UNION ALL
    SELECT '대한민국' NATION_NM, 3 PLAY, 1 WIN, 0 DRAW, 2 LOSE, '3/3' GAL, 0 GAP, 5 SCORE 
    FROM DUAL UNION ALL
    SELECT '독일' NATION_NM, 3 PLAY, 1 WIN, 0 DRAW, 2 LOSE, '2/4' GAL, -2 GAP, 3 SCORE 
    FROM DUAL
)
 
SELECT NATION_NM, PLAY, WIN, DRAW, LOSE, GAL, GAP, SCORE
     , RANK() OVER(ORDER BY SCORE DESC) RNK
     , ROW_NUMBER() OVER(ORDER BY SCORE DESC) RNM
FROM TESTDB
;
cs


결과를 보면 RANK() OVER() 함수는 순위가 동일할 경우 동일한 순위를 부여하고, 다음 순위는 건너뛰고 순서를 정한다.

( 1 -> 3 -> 4 )

반면, ROW_NUMBER() OVER() 함수는 순위가 동일한 경우에도 순서대로 순위를 부여하는 것을 확인할 수 있다.



+DENS_RANK() OVER() 함수도 있는데 이 경우에는 순위가 동일할 경우 동일한 순위를 부여하고, 다음 순위에 대해 순차적으로 순위를 부여한다.

DENSE_RANK() OVER(ORDER BY SCORE DESC) DNK



상황에 따라 활용하면 좋은 함수이다.

+피드백은 언제나 환영입니다 :)



반응형

'Database > Oracle' 카테고리의 다른 글

[Oracle]데이터 복구(TIMESTAMP)  (0) 2018.07.12
[Oracle]시간 계산  (0) 2018.07.09
[Oracle]SELECT 결과 UPDATE  (0) 2018.06.28
[Oracle]백분율 구하기  (2) 2018.06.28
[Oracle]CHR(13)과 CHR(10)  (0) 2018.06.26
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.