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건의 데이터만 조회
출처
[Oracle] 오라클 PARTITION BY 사용법 정리 (분석함수)
오라클에서 분석함수를 사용할 때 PARTITION BY를 사용하여 그룹으로 묶어서 연산을 할 수 있다. GROUP BY 절을 사용하지 않고, 조회된 각 행에 그룹으로 집계된 값을 표시할 때 OVER 절과 함께 PARTITION B
gent.tistory.com
'SQL' 카테고리의 다른 글
GOLDEN 6 / ORACLE (0) | 2023.05.10 |
---|---|
ORACLE : ORA-30076: 발췌 소스에 발췌 필트가 부적당합니다 (0) | 2023.05.04 |
ORACLE ROW_NUMBER() OVER ( PARTITION BY ORDER BY DBMS_RANDOM.RANDOM ) (0) | 2023.04.26 |
ORACLE DBMS_RANDOM + ROWNUM [LIMIT] (0) | 2023.04.26 |
ORACLE TRUNC : 특정 달의 첫 날 (0) | 2023.04.25 |