这三个函数都是排序函数,那么有什么不同呢,下面看个例子:
sql> select empno,2 ename,3 deptno,4 sal,5 row_number() over(partition by deptno order by sal) sql_rownum,6 rank() over(partition by deptno order by sal) sql_rank,7 dense_rank() over(partition by deptno order by sal) as sal_denserank 8 from emp;
EMPNO ENAME DEPTNO SAL sql_ROWNUM sql_RANK SAL_DENSERANK ---------- ---------- ---------- ---------- ---------- ---------- ------------- 7934 MILLER 10 1300 1 1 1 7782 CLARK 10 2450 2 2 2 7839 KING 10 5000 3 3 3 7369 SMITH 20 800 1 1 1 7566 JONES 20 2975 2 2 2 7902 FORD 20 3000 3 3 3 7900 JAMES 30 950 1 1 1 7521 WARD 30 1250 2 2 2 7654 MARTIN 30 1250 3 2 2 7844 TURNER 30 1500 4 4 3 7499 ALLEN 30 1600 5 5 4 7698 BLAKE 30 2850 6 6 5
已选择12行。
上面sql中,这三个函数都采用deptno列进行分组,以列sal进行升序排序。 我们看empno为7900-7698的行。在相同分组和相同字段相同顺序排序的情况下:row_number函数只是单纯的返回行排序后的序号;rank函数在sal相同时,采用相同的行号,但是之后的行会继续按单纯的排序号继续编号; dense_rank返回在结果,会在sal相同时采用相同的排序号,但是之后按上面的序号继续排序。 也就是我们通过说rank会跳号,dense_rank不会跳号。