DataBase > Oracle/Tibero

페이징처리, rownum, row_number(), 총갯수 [ rownum and row_number() ]

#paging#oracle#tibero

ROWNUM

1) 조회된 순서로 순번을 정한다.

SELECT ROWNUM, A.* FROM TBL A;

2) ORDER BY를 사용하면 순번이 ORDER BY 전 순서를 매긴 후 ORDER BY 되므로 순서가 섞여진다.

※ 원하는 결과를 위해서는 ORDER BY 이후 새롭게 ROWNUM 를 매긴다.

SELECT
  ROWNUM, A.*
FROM
(
    SELECT * FROM TBL ORDER BY NAME
) A;

ROW_NUMBER()

※ (문법) ROW_NUMBER() OVER ( [PARTITION BY {그룹할 컬럼들}] ORDER BY {정렬할 컬럼들})

1) ORDER BY 결과취득시 사용 (ROWNUM 과 달리 단일 쿼리로 실행)

SELECT ROW_NUMBER() OVER(ORDER BY A.NAME, A.AGE) ROW_NUM, A.* FROM TBL A

2) 정렬을 그룹을 나눠 순번을 매길수 있다. (PARTITION)
  1. - SELECT ROW_NUMBER() OVER( PARTITION BY A.NAME ORDER BY A.NAME, A.AGE) ROW_NUM, A.* FROM TBL A
  2. - ROW_NUM 은 NAME 으로 1,2,... 과 AGE 로 다시 1,2,3... 으로 번호가 부여된다.
  3. - PARTITION BY 를 사용하면 그룹기준으로 1등 또는 1~N 등까지만 추출 가능하다.
  4. - 예로 각각의 부서에서 급여가 제일 높은사람
SELECT B.* FROM (
     SELECT ROW_NUMBER() OVER(PARTITION BY A.부서 ORDER BY A.급여) FROM USER_TBL A
) B WHERE B.ROW_NUM = 1;
 

 

정렬한 결과에 대한 rownum을 지정을 할 경우

SELECT 
      *
FROM (
            SELECT
                  --[ 정렬한 결과에 대한 rownum를 지정한다.]--
                  row_number() over(order by #{정렬할 컬럼} as rnum

                  --[ 쿼리내용과 더불어 전체갯수를 취득한다. (full scan << 사용않는게)]--
                , count(1) over() as total_cnt

                , A.*
             FROM MY_TABLE A
             WHERE   stDt >= to_date('20200101','YYYYMMDD')
                  AND edDt <  to_date('20200201','YYYYMMDD')

         )
WHERE rnum BETWEEN 11 AND 20;