본문 바로가기
데이터베이스/Oracle

[Oracle] 오라클 순위 관련 함수(ROW_NUMBER, RANK, DENSE_RANK)

by drCode 2021. 6. 10.
728x90
반응형

 

게시판의 기본적인 정보와 조회수에 따른 행의 번호를 확인하고 싶을 때,

 

다음과 같은 쿼리를 사용하였다.

SELECT ROWNUM, ID, TITLE, WRITER_ID, REGDATE, HIT 
  FROM NOTICE
 ORDER BY HIT ASC;

 

 

흠... 조회수 오름차순으로 데이터가 보여지기는 하는데, 

 

ROWNUM을 먼저 반영하고 그다음에 정렬을 한듯한 느낌이다.

 

HIT 오름차순으로 정렬한 후 ROWNUM을 반영하는 방법이 없을까..

 

728x90

 

물론 있다

 

SELECT ROW_NUMBER() OVER (ORDER BY HIT)  , ID, TITLE, WRITER_ID, REGDATE, HIT 
  FROM NOTICE; 

 

ROW_NUMBER()를 이용하면 원하는 결과를 얻을 수 있다.

 

 

SELECT ROW_NUMBER(), ID, TITLE, WRITER_ID, REGDATE, HIT 
  FROM NOTICE
 ORDER BY HT; 

 

위의 코드도 될까 하는 호기심에 한번 실행해봤더니 돌아가질 않는다.

 

 

아무래도 기준이 되는 OVER(ORDER BY 컬럼) 을 써줘야 하는 것 같다.

 

SELECT RANK() OVER (ORDER BY HIT)  , ID, TITLE, WRITER_ID, REGDATE, HIT 
  FROM NOTICE;

 

다음 RANK 함수는 오름차순 순으로 공동 순위를 반영하여 나타낸다

 

 

그렇다면 그룹을 지정하여 순위를 보여주는 방법은 없을까?

 

DENSE_RANK를 사용하면 된다. 단, 그룹을 잡을 때 기준을 삼을 컬럼이 필요하다.

 

SELECT DENSE_RANK() OVER (PARTITION BY WRITER_ID ORDER BY HIT)  , ID, TITLE, WRITER_ID, REGDATE, HIT 
  FROM NOTICE;

 

PARTITION BY 컬럼 << 컬럼을 기준으로 그룹을 지정하고, ORDER BY HIT 조회순으로 순위를 매기게 된다.

 

 

728x90
반응형

댓글