KDT/DB

240412 DB 순위 함수

001cloudid 2024. 4. 12. 15:05
728x90

순위 함수

순위 함수

  • rank() : 순위를 구하기 위한 함수
  • row_number() : 순위를 구하되 동일 값에 대해서도 고유한 순위를 부여

※차이 : 공동 순위가 있을 때 어떻게 반환해주는가가 다름

 

--rank
rank() over (order by 컬럼명 asc/desc)

--row_number
row_number() over (order by 컬럼명 asc/desc)

-- ex 1
select employee_id, last_name, salary,
rank() over (order by salary desc) rank1,
row_number() over (order by salary desc) rank2
from employees
order by salary salary

 

ex1

 

row_number -> 공동순위가 있을 경우 저장된 순서대로 나타남. 기준을 세세하게 해줌으로서 순위를 지정할 수 있음

 

-- ex2
select employee_id, last_name, salary, department_id,
-- 기준을 여러 개 할 수 도 있음, 순위를 지정하기 위해 여러 개의 컬럼을 기준으로 정렬할 수 있음
-- ※ row_number() over도 마찬가지로 기준을 여러 개 지정할 수 있음
rank() over (order by salary desc, department_id) rank
from employees
order by salary desc, department_id;

 

ex2

 

-- ex3
select employee_id, last_name, department_id, salary,
rank() over(partition by department_id order by salary desc) rank
from employees
order by department_id, salary desc;

 

ex3

 

※partition by 컬럼명 => 그룹과 유사

부서별로 파티션이 나눠짐

 


연습문제

select * from
(select rank() over(order by a.salary desc) rank,
a.employee_id, a.last_name, a.salary, a.department_id, b.department_name
from employees a join departments b
on a.department_id = b.department_id
order by rank desc)
where rank between 10 and 20;

-- ==

select * from
(select row_number() over(order by a.salary desc) rank,
a.employee_id, a.last_name, a.salary, a.department_id, b.department_name
from employees a join departments b
on a.department_id = b.department_id
order by rank desc)
where rank between 10 and 20;

 

※ rank() 또는 row_number()는 쿼리가 다 만들어지고 나서 순번을 매기기 때문에 조건을 사용할 수 없음. rank()나 row_number()에 조건을 넣기 위해서는 묶어서 사용해야함

top n 분석 확인할 것!

 

 

728x90

'KDT > DB' 카테고리의 다른 글

240417 DB - 오라클 정리  (0) 2024.04.17
240402 DB - Top-N 분석  (0) 2024.04.02
240329 DB - 사용자 관리를 위한 Data Dictionary  (0) 2024.03.29
240327 DB - 데이터 제어어(DCL)  (0) 2024.03.27
240321 DB - 조건부 표현식 2  (0) 2024.03.21