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
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;
-- 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;
※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 |