명단에서 총 순위의 80%에 해당하는 사람의 정보가 나와야 하는 경우가 생겼다.
rownum 같은경우는 order by 하기 전에 미리 번호가 부여되어있기때문에 order by해 버리면 번호가 뒤죽박죽된다.
rownum 같은경우는 order by 하기 전에 미리 번호가 부여되어있기때문에 order by해 버리면 번호가 뒤죽박죽된다.
이럴 경우 rank(),
dense_rank(), row_number() 함수를 사용하면 된다.
하지만 문제는 내가 사용하는 오라클 시스템 버전이 너무 하위버전이라 이 함수들이 적용될지가 문제..
다행히도 지원해준다.
rank(), dense_rank()와 row_number()의 차이점은 1등이 2명있을경우 row_number()는 두번째 sorting되는 값이 1이 아닌 2를 가지게 된다. 즉 첫번째, 두번째가 동점일지라도 순위는 1, 2로 값을 다르게 부여한다.
dense_rank()는 위의 경우에 1, 1로 값이 들어가고 세번째에는 2가들어간다. 마지막으로 rank()는 1, 1 그리고 3이 들어간다.
*예
*사용법
하지만 문제는 내가 사용하는 오라클 시스템 버전이 너무 하위버전이라 이 함수들이 적용될지가 문제..
다행히도 지원해준다.
rank(), dense_rank()와 row_number()의 차이점은 1등이 2명있을경우 row_number()는 두번째 sorting되는 값이 1이 아닌 2를 가지게 된다. 즉 첫번째, 두번째가 동점일지라도 순위는 1, 2로 값을 다르게 부여한다.
dense_rank()는 위의 경우에 1, 1로 값이 들어가고 세번째에는 2가들어간다. 마지막으로 rank()는 1, 1 그리고 3이 들어간다.
*예
성명 |
점수 |
rank() | dense_rank() |
row_number() |
A | 100 | 1 | 1 |
1 |
B | 100 | 1 | 1 | 2 |
C | 90 | 3 | 2 | 3 |
D | 80 | 4 | 3 | 4 |
*사용법
[rank()||dense_rank()||row_number()] over (partition by '그룹화 할 필드' order by '정렬 필드' [desc||asc])