[Oracle] 오라클 - 분석 함수 (RANK/ DENSE_RANK/ROW_NUMBER)
by mini_min[Oracle]
오라클 - 분석 함수 (RANK/ DENSE_RANK/ROW_NUMBER)
✔️ 순위 함수
분석 함수 : 행 그룹을 기반으로 집계 값을 계산하여, 여러 행을 반환한다는 점이 집계 함수와 다르다.
- 질의 결과를 분할하기 위해서 PARTITION BY 절을 사용하고,
OVER() 안에 순위 나누는 기준이 되는 ORDER BY를 해줘야한다.
--급여 내림차순 순위
SELECT name, sal,
RANK() OVER(ORDER BY sal DESC) 순위
FROM emp;
--급여 내림차순, 급여가 같으면 보너스 내림차순 순위
SELECT name, sal, bonus,
RANK() OVER(ORDER BY sal DESC, bonus DESC) 순위
FROM emp;
⭐ PARTITION BY : "부서별" 순위. 파티션 나눈 것. (ex 학년 석차 구할 때)
SELECT name, dept, pos, sal,
RANK() OVER(PARTITION BY dept ORDER BY sal DESC) 부서순위,
RANK() OVER(PARTITION BY dept, pos ORDER BY sal DESC) 부서직위순위
FROM emp;
✔️ DENSE_RANK() OVER()
촘촘하게 순위를 설정해줌. 1등 여러명 + 2등 + 3등 여러명 등 이렇게 가능
SELECT name, dept, pos, sal,
DENSE_RANK() OVER(ORDER BY sal DESC) 부서순위
FROM emp;
✔️ ROW_NUMBER() OVER()
절대값 순위가 나온다. 겹치는 등수 따위 없음
SELECT name, dept, pos, sal,
ROW_NUMBER() OVER(ORDER BY sal DESC) 부서순위
FROM emp;
🔒 문제
--급여 상위 1~10순위 출력 : 이름, SAL , 순위
SELECT * FROM (SELECT name, sal,
RANK() OVER(ORDER BY sal DESC) 순위
FROM emp
) WHERE 순위 <= 10;
💡 서브쿼리를 써야 풀 수 있는 문제다. 랭킹을 구해두고 서브쿼리로 WHERE 절로 부분 추출한다.
--급여 상위 10% 출력 (name, sal 출력)
SELECT * FROM (SELECT name, sal,
RANK() OVER(ORDER BY sal DESC) 순위
FROM emp
) WHERE 순위 <= (SELECT MAX(sal) FROM emp)*0.1;
-- 부서별 여자 인원수가 가장 많은 부서명 및 인원수
SELECT dept, 인원 FROM(
SELECT dept, COUNT(*) 인원,
RANK()OVER(ORDER BY COUNT(*) DESC) 순위
FROM emp
WHERE MOD(SUBSTR(rrn,8,1),2) = 0
GROUP BY dept
) WHERE 순위 = 1;
✔️ RANK() WITHIN GROUP()
조건값의 순위를 구해준다. 랭크 가로 안에 조건 값을 넣으면 조건이 몇 등인지 추출
--sal 이 300만원이면 몇 등?
SELECT RANK(3000000) WITHIN GROUP(ORDER BY sal DESC) 순위
FROM emp;
'SQL쿼리' 카테고리의 다른 글
[Oracle] 오라클 - AVG() OVER() / MAX() 와 MIN() / RATIO_TO_REPORT() (0) | 2022.08.09 |
---|---|
[Oracle] 오라클 - COUNT() OVER() / SUM() OVER() (0) | 2022.08.09 |
[Oracle] 오라클 - ROLLUP/CUBE/GROUPING + GROUP_ID (0) | 2022.08.09 |
[Oracle] 오라클 - 서브쿼리 subquery (0) | 2022.08.09 |
[Oracle] 오라클 - NULL 관련 함수(NVL) (0) | 2022.08.09 |
블로그의 정보
개발자 미니민의 개발로그
mini_min