본문 바로가기
SQL

ORACLE : ROW_NUMBER, RANK

by sooyeoon 2023. 5. 2.

ORACLE에서 조건별 가장 최근 데이터만 가져오거나, 중복되지 않도록 카테고리별 하나씩만 선택되는 쿼리를 작성하기 위해 ROW_NUMBER와 RANK 함수를 사용할 수 있다. 

/* RANK */
-- RANK
RANK() OVER (PARTITION BY 그룹컬럼 ORDER BY 순서기준컬럼 DESC) AS RNK

-- RANK EX)
SELECT COL_A, COL_B, SELECT RANK() OVER (PARTITION BY A.BS_CODE ORDER BY DATE_COL DESC) AS RNK
...
WHERE RNK ='1' 

/* ROW_NUMBER */
-- ROW_NUMBER
ROW_NUMBER() OVER ( PARTITION BY 그룹컬럼 ORDER BY 순서기준컬럼 )

-- ROW_NUMBER EX)
SELECT * 
FROM ( 
   SELECT COL_A, COL_B, ...,
   ROW_NUMBER() OVER ( PARTITION BY DEPT_NM ORDER BY DBMS_RANDOM.RANDOM ) AS RN
   ... 
   FROM 
   WHERE
) -- SUB QUERY

WHERE RN = 1

RANK 함수를 사용해도 ROW_NUMBER 함수를 사용할 때와 동일한 결과를 얻을 수 있다.

ROW_NUMBER 함수와  RANK 함수 차이점

RANK 함수는 정렬 조건이 동일한 데이터가 존재할 경우 2건 이상이 조회될 수 있지만

ROW_NUMBER 함수는 무조건 1건의 데이터만 조회

 

출처

https://gent.tistory.com/442

 

[Oracle] 오라클 PARTITION BY 사용법 정리 (분석함수)

오라클에서 분석함수를 사용할 때 PARTITION BY를 사용하여 그룹으로 묶어서 연산을 할 수 있다. GROUP BY 절을 사용하지 않고, 조회된 각 행에 그룹으로 집계된 값을 표시할 때 OVER 절과 함께 PARTITION B

gent.tistory.com