독서하는 개발자's Blog

반응형

ROW_NUMBER() 어떻게 써요?

 

ROW_NUMBER()은 나누고 싶은 곳에서 구역을 나누고(PARTITION BY) 정렬해서 순서(ORDER BY)를 정하거나

- ROW_NUMBER() OVER(PARTITION BY ~ ORDER BY ~ )

 

원하는 컬럼에 대해 정렬만 해서 순서(ORDER BY)를 정하는 방법이다.

- ROW_NUMBER() OVER(ORDER BY ~ )

 

간략하게 ROW_NUMBER에 대한 설명을 보자.

 

* ROW_NUMBER의 문법은 ROW_NUMBER() OVER(query_partition_clause order_by_clause)

* ROW_NUMBER는 분석 함수다.

* 적용되는 각 행 (파티션의 행 또는 쿼리에 의해 반환되는 각 행)에 1부터 시작하는 order_by_clause에서 지정된 행의 순서로 고유 번호를 할당한다.

* 지정된 범위의 ROW_NUMBER 값을 검색하는 쿼리에서 ROW_NUMBER를 사용하여 서브 쿼리를 중첩하여 내부 쿼리 결과에서 정확한 행의 일부를 찾을 수 있다.

 

위에 설명이 무슨 말인지 예제를 보며 확인하자.

 

* 예제) employee 테이블의 각 부서에서 가장 급여가 높은 직원 3명을 검색하라.

SELECT department_id, first_name, last_name, salary
FROM
  (
    SELECT
      department_id, first_name, last_name, salary,
      ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary desc) rn
    FROM employees
  )
WHERE rn <= 3
ORDER BY department_id, salary DESC, last_name;

 

코드분석

- 서브쿼리로 ROW_NUMBER를 이용하여 department_id 별로 파티션을 나누고(PARTITION BY) 나눠진 상태에서 급여를 내림차순으로 정렬(ORDER BY salary desc)

- 서브쿼리 바깥에서 where 절에 rn <=3 을 이용해 상위 3명의 정보 확인

- ORDER BY로 where절로 뽑은 상위 3명에 대해 오름차순 정렬하였다.

( ORDER BY는 정렬기준 - DESC로 쓰지않으면 default로 ASC - 오름차순 정렬)

 

 

도움이 되셨다면 공감과 광고 한번 씩 눌러주시면 감사합니다!!

 

2019/04/16 - [개발 관련(오류 및 정리)/XML, MYSQL, ORACLE - 오류 및 정리] - [Oracle] LEVEL 계층 구조 및 사용법

2019/04/16 - [개발 관련(오류 및 정리)/XML, MYSQL, ORACLE - 오류 및 정리] - [Oracle] 계층구조 쿼리란? (Hierarchical Queries)

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band