oracle 排序的分析函数,Oracle 排序分析函数之ROW_NUMBER、RANK和DENSE_RANK简析

本文通过示例解释了SQL中row_number、rank和dense_rank三个排序函数的区别。在相同分组和排序条件下,row_number为每一行提供唯一的序列号,rank在值相同时会跳号,而dense_rank则不会,确保相同值具有相同的排名。
摘要由CSDN通过智能技术生成

这三个函数都是排序函数,那么有什么不同呢,下面看个例子:

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不会跳号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值