SQL/분석함수

[SQL]분석함수(analytic function)_순위함수(RANK, DENSE_RANK, ROW_NUMBER)

한기리 2020. 9. 19. 20:33
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