Data Base/Oracle SQL

231023 Oracle SQL TOP_N 분석 rownum, rank(), dense_rank()

잇꼬 2023. 10. 23. 17:36
728x90
반응형
SMALL

■ TOP-N 분석
ex) 최고급여자 중에 10위까지 출력하세요

1# 내림차순 

SELECT employee_id, salary 
FROM hr.employees
ORDER BY salary desc;


2# 정렬한 결과 집합을 이용해서 10위까지만 출력.
    - rownum : fetch 번호를 리턴하는 가상컬럼
  
#1 주의할 점  
    - salary 컬럼안에 data 값이 중복성이 없다면 아래 코드로 작성가능.
    - 중복성이 있을 경우는 절대 사용하면 안된다.
SELECT rownum, employee_id, salary
FROM ( SELECT employee_id, salary 
       FROM hr.employees
       ORDER BY salary desc ) 
WHERE rownum <= 10;

#2 주의할 점
    - random 하게 데이터 10건만 추출해서 정렬한다., inline view 에 rownum 를 쓰지 말것!
    SELECT rownum, employee_id, salary 
    FROM hr.employees
    WHERE rownum <= 10
    ORDER BY salary desc;

# 순위를 구하는 함수. rank() VS dense_rank()
    ★ rank() : 순위를 구하는 함수. 동일한 순위가 있을 경우, 다음 순위의 갭이 생긴다. 
    ★ dense_rank() : 순위를 구하는 함수. 동일한 순위가 있더라도 '연이은 순위'를 구한다.
    

SELECT 
    employee_id, 
    salary , 
    rank() over(order by salary desc) rank , 
    dense_rank() over(order by salary desc) dense_rank
FROM hr.employees;


# 10위까지 추출 : rank()

SELECT * 
FROM ( SELECT 
            employee_id, 
            salary , 
            rank() over(order by salary desc) rank 
       FROM hr.employees)
WHERE rank <= 10 ;



# 10위까지 추출 : dense_rank()

SELECT * 
FROM ( SELECT 
            employee_id, 
            salary , 
            dense_rank() over(order by salary desc) dense_rank 
       FROM hr.employees)
WHERE dense_rank <= 10 ;



# 부서별 순위

SELECT 
    employee_id, 
    salary , 
    department_id , 
    rank() over(partition by department_id order by salary desc) rank , 
    dense_rank() over(order by salary desc) dense_rank
FROM hr.employees;
728x90
반응형
LIST

'Data Base > Oracle SQL' 카테고리의 다른 글

231026 PL/SQL SQL문  (1) 2023.10.26
231024 Oracle SQL SAVEPOINT  (0) 2023.10.24
231023 Oracle SQL 분석함수  (1) 2023.10.23
231023 Oracle SQL 날짜타입  (1) 2023.10.23
231023 Oracle SQL SYNONYM(동의어)  (0) 2023.10.23