728x90
320x100
순위 함수
* 순위 함수는 정렬 조건에 따른 순위를 반환한다. 순위 집계 함수는 가상의 행을 생성하지만, 순위 분석 함수는 실제의 행으로 값을 계산한다.
| RANK 함수
RANK 함수는 order_by_clause에 따른 순위를 반환한다. expr이 동일하면 동순위를 부여하고, 다음 순위는 동순위의 개수만큼 건너뛴다.
RANK() OVER([query_partition_clause] order_by_clause)
ex )
SELECT empno, ename, sal, RANK() OVER(ORDER BY sal) AS c1
FROM emp
WHERE deptno = 30
ORDER BY 3, 1;
| DENSE_RANK 함수
DENSE_RANK 함수도 order_by_clause에 따른 순위를 반환한다. 동순위가 존재하더라도 다음 순위를 이어서 부여한다.
DENSE_RANK() OVER([query_partition_clause] order_by_clause)
ex )
SELECT empno, ename, sal, DENSE_RANK() OVER(ORDER BY sal) AS c1
FROM emp
WHERE deptno = 30
ORDER BY 3, 1;
| ROW_NUMBER 함수
ROW_NUMBER 함수는 order_by_clause에 따른 고유한 순번을 반환한다. 정렬 값이 동일하더라도 다른 순번을 부여하기 때문에 결과 값이 변경될 수 있다.
ex 1 )
SELECT empno, ename, sal
, ROW_NUMBER() OVER(ORDER BY sal) AS c1
, ROW_NUMBER() OVER(ORDER BY sal, empno) AS c2
FROM emp
WHERE deptno = 30
ORDER BY 3, 1;
ex 2 )
SELECT empno, ename, sal, deptno
FROM (SELECT a.*
, ROW_NUMBER() OVER(PARTITION BY deptno
ORDER BY hiredate DESC, empno DESC) AS rn
FROM emp a)
WHERE rn = 1;
ex 3 )
SELECT empno, ename, sal
, ROW_NUMBER() OVER(ORDER BY sal) AS c1
, RANK() OVER(ORDER BY sal) AS c2
, DENSE_RANK() OVER(ORDER BY sal) AS c3
FROM emp
WHERE deptno = 30
ORDER BY 3, 2;
728x90
320x100