Oracle 排序分析函数之ROW_NUMBER、RANK和DENSE_RANK

时间:2023-03-08 17:16:25
我们都知道分析函数功能很强大,可能需要写很复杂的标准SQL才能办到或不可能办到的事,使用分析函数却能很容易完成。我们经常会用到排序分析函数,如ROW_NUMBER,RANK,DENSE_RANK。
这三个函数都是排序函数,那么有什么不同呢,下面看个例子:
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不会跳号。