오라클 순위함수(분석함수)

조수경·2021년 9월 29일
0

Oracle

목록 보기
7/19

순위함수(분석함수)

  • 특정 컬럼을 기준으로 크기에 따른 순위를 구하는 함수
  • RANK() OVER, DENSE_RANK() OVER, ROW_NUMBER() OVER
  • 그룹내에서 순위는 RANK() OVER(PARTITION ~ )함수 사용
    1) RANK() OVER
    . 순위부여시 중복값(같은값)이 발생되면 중복값의 갯수만큼 건너 뛰고 다음 순위 부여
    ex) 90,80,80,80,70 => (1,2,2,2,5..)
    --동점자가 3명이라 70점은 5등이됨 DENSE_RANK() OVER: {1,2,2,2,3}, ROW_NUMBER() OVER{1,2,3,4,5}
    (사용형식)
    RANK() OVER(ORDER BY 컬럼명 [ASC|DESC]) [AS 별칭] --컬럼의 값이 등수를 부여하는 기준 (사용예) 사원테이블에서 80번 부서직원 중 입사년도가 가장 빠른 직원부터 순위를 부여하여 조회하시오
    Alias는 사원번호, 사원명, 입사일자, 순위
           SELECT  EMPLOYEE_ID AS 사원번호,
                   EMP_NAME AS 사원명,
                   HIRE_DATE AS 입사일자,
                   RANK() OVER(ORDER BY HIRE_DATE ASC) AS 순위 
           FROM HR.EMP
           WHERE DEPARTMENT_ID = 80;
    2) DENSE_RANK() OVER
    .중복순위 발생 후 다음 순위를 연속된 값을 부여
    ex) 90,80,80,80,70 => 1,2,2,2,3,... (사용예) 상품테이블에서 매출가격 순으로 등수를 DENSE_RANK()함수 형식으로 부여하시오
          SELECT PROD_ID AS 상품코드,
               PROD_NAME AS 상품명,
               PROD_PRICE AS 판매가,
               RANK() OVER(ORDER BY PROD_PRICE DESC)AS 순위1,
               DENSE_RANK() OVER(ORDER BY PROD_PRICE DESC)AS 순위2
               FROM PROD;
               
      

3) ROW_NUMBER() OVER -- 제일 많이 씀
. 중복값에 관계없이 SEQUENCE(순차적인 순위 값) 값을 반환
ex) 90,80,80,80,70 => 1,2,3,4,5,...

   (사용예) 상품테이블에서 매출가격 순으로 등수를 DENSE_RANK()함수 형식으로 부여하시오
        SELECT PROD_ID AS 상품코드,
            PROD_NAME AS 상품명,
            PROD_PRICE AS 판매가,
          --RANK() OVER(ORDER BY PROD_PRICE DESC)AS 순위1,
          --DENSE_RANK() OVER(ORDER BY PROD_PRICE DESC)AS 순위2,
            ROW_NUMBER() OVER(ORDER BY PROD_PRICE DESC) AS 순위3 
            --ODER BY 절을 사용하지 않아도 정렬값으로 출력해줌
            FROM PROD;
   

4)그룹내 순위
. 그룹별로 순위를 구하기 위해 사용되는 순위함수
(사용형식)
RANK() OVER(PARTITION BY 컬럼명1[,컬럼명2,...] ORDER BY 컬럼명11[,컬럼명12,..][ASC|DESC])
- '컬럼명1[,컬럼명2,..]' : 그룹화의 기준 컬럼명
- '컬럼명11[,컬럼명12,..]' : 정렬의 기준 컬럼명

  (사용예) 상품테이블에서 분류별로 상품의 매출가격 순으로 등수를 부여하시오 
         SELECT PROD_ID AS 상품코드,
                PROD_NAME AS 상품명,
                PROD_LGU AS 분류코드,
                PROD_PRICE AS 가격,
                RANK() OVER(PARTITION BY PROD_LGU ORDER BY PROD_PRICE DESC) AS 순위
           FROM PROD;
         
         
profile
신입 개발자 입니다!!!

0개의 댓글