검색결과 리스트
Oracel에 해당되는 글 1건
- 2020.12.27 Oracle 순위함수의 사용,간단한 사용예제
글
Oracle 순위함수의 사용,간단한 사용예제
오늘은 Oracle 에서 순위함수에 대해서 알아봅시다.
- ROW_NUMBER()
- RANK()
- DENSE_RANK()
위의 3개의 함수를 사용하면서 개념을 알아봅시다.
아래는 예제로 사용할 테이블 컬럼들 입니다.
SELECT ROWNUM ,rank_test.* FROM rank_test ORDER BY BOARD_CNT DESC;
위의명령어로 실행을 하였을때 우리의 생각과 다른 문제점이 1개가 발생합니다.
ROWNUM 시스템의 순번을 메기는 함수입니다. 하지만 ORDER BY 를 사용하는 순간
ROWNUM 의 순번이 뒤죽박죽으로 나오는 것을 확인할 수 있습니다.
분명히 ROWNUM 은 순번을 메기는 거라고 알고 있엇는데 왜 뒤죽박죽으로 나온것일까?
그 이유는 쿼리가 실행되는 순서에 관련이 있습니다.
지금 저 쿼리문에서 실행순서는 FROM -> ORDER BY -> SELECT 이 순서대로 실행되고 있기때문에 당현히 ORDER BY 된 후 SELECT 되기에 순서가 뒤죽박죽으로 나오는 것입니다.
자 그럼 어떻게 저 쿼리문을 사용하되 ROWNUM이 순서대로 나오게 할수 있을까?
이때 사용하는 함수가 ROW_NUMBER() 라는 함수 입니다.
SELECT ROW_NUMBER() OVER (ORDER BY BOARD_CNT) AS SEQ ,rank_test.* FROM rank_test;
바뀐점은 ROWNUM => ROW_NUMBER() OVER ( ORDER BY 문 ) ROW_NUM() 함수를 사용하면서 ORDER BY 를 함수 () 안에 넣을 것입니다.
결과가 어떻게 나올까요?
SEQ 순번으로 지정한것이 순서대로 바르게 나오는 것을 확인할 수 있습니다.
SELECT RANK() OVER (ORDER BY BOARD_CNT) AS SEQ ,rank_test.* FROM rank_test;
RANK() 함수를 사용하면은 결과가 어떻게 나올까요?
결과창에서 이상한점이 보이시나요? SEQ 컬럼이 분명 1 다음 2가 나와야 할텐데 어째서 해당컬럼만큼 건너뛰어서 6이 나올까요?
어떻게 하면은 정상적으로 순번이 나오도록 할수 있을까?
SELECT DENSE_RANK() OVER (ORDER BY BOARD_CNT) AS SEQ ,rank_test.* FROM rank_test;
▼해당 쿼리문의 결과▼
정상적으로 1 - 2 - 3 으로 출력되는 것을 확인 할 수 있습니다.
추가적으로 지역별로 랭킹을 알고 싶을때는 PARTITION BY 라는 것을 사용하면 보다 편리하게 지역별 랭킹을 알 수있습니다.
SELECT DENSE_RANK() OVER ( PARTITION BY ADDRESS ORDER BY BOARD_CNT DESC) AS SEQ ,rank_test.* FROM rank_test;
▼해당 쿼리문의 결과▼
경기도/광주/서울 에서의 랭킹을 한눈에 볼 수 있습니다.
상황에 따라서 PARTITION BY 을 사용하면 보다 편리하게 사용할 수 있을거 같은 생각이 듭니다.
'Oracle' 카테고리의 다른 글
Oracle (+) 연산자는 무슨 의미인가? (0) | 2020.12.27 |
---|