Where The Streets Have No Name

rank() 본문

Developement/DataBase

rank()

highheat 2006. 4. 7. 15:48
RANK와 DENSE_RANK는 어떤 한 GROUP에서 항목들의 순위를 매길 수 있는 기능을 제공한다.
SYNTAX :
RANK() OVER (
[PARTITION BY [, ...]]
ORDER BY [collate clause] [ASC|DESC]
[NULLS FIRST|NULLS LAST] [, ...] )
DENSE_RANK() OVER (
[PARTITION BY [, ...]]
ORDER BY [collate clause] [ASC|DESC]
[NULLS FIRST|NULLS LAST] [, ...] )

1.RANK의 특징
  • 정렬 순서는 ascending이 default이며 descending으로 지정이 가능하다.
  • PARTITION BY는 선택항목이며 QUERY의 RESULT SET을 RANK FUNCTION을 적용할 GROUP으로 나눈다.다시 말해 RANK는 GROUP이 바뀔 때 마다 새로운 SET에 대하여 연산을 수행하게 된다.
  • PARTITION BY 절이 생략되면 RANK는 QUERY의 전체 RESULT SET에 적용된다.
  • ORDER BY는 순위가 매겨지는 기준을 정의하는 절이다.
  • NULLS FIRST나 NULL LAST는 ORDER SEQUENCE에서 NULL의 위치를 나타낸다.
RANK와 DENSE_RANK의 차이는 순위가 같을 때 RANK는 ranking sequence에 gap을 허용하지만 DENSE_RANK는 gap을 허용하지 않는다.
2.RANKING ORDER
다음은 [ASC | DESC]이 어떻게 ranking order를 변화시키는지를 보여주는 사례이다.
SELECT deptno,empno, sal,
RANK() OVER (ORDER BY sal) AS asc_rank,
RANK() OVER (ORDER BY sal desc nulls last) as desc_rank
FROM emp;
DEPTNO
EMPNO
SAL
ASC_RANK
DESC_RANK
10
7839
5000
14
1
20
7788
3000
12
2
20
7902
3000
12
2
20
7566
2975
11
4
30
7698
2850
10
5
10
7782
2450
9
6
30
7499
1600
8
7
30
7844
1500
7
8
10
7934
1300
6
9
30
7521
1250
4
10
30
7654
1250
4
10
20
7876
1100
3
12
30
7900
950
2
13
20
7369
800
1
14
 
3.Ranking on multiple Expressions
Result Set에서 Ranking을 매기고자 하는 value가 동률을 이룰 때 이것을 해결하기 위해 다른 expression을 사용할 수 있다.
SELECT deptno,empno, sal,  
     RANK() OVER (ORDER BY sal desc,empno nulls last) as desc_rank  
FROM emp
WHERE DEPTNO = 30;
DEPTNO
EMPNO
SAL
DESC_RANK
30
7698
2850
1
30
7499
1600
2
30
7844
1500
3
30
7521
1250
4
30
7654
1250
5
30
7900
950
6