Oracle 中 row | 您所在的位置:网站首页 › oracle的rownum函数 › Oracle 中 row |
一、row_number() 函数
在前面使用 rownum 实现分页,虽然是可以实现的,但是看似是否有点别扭。因为当需要对分页排序时,rownum 总是先生成序列号再排序,其实这不时我们想要的。而 row_number() 函数则是先排序,再生成序列号。这也是 row_number 与 rownum 主要的区别。下面来看 row_number() 的使用: 语法:row_number() over([partition by col1] order by col2 [ASC | DESC] [,col3 [ASC | DESC]]...) 参数解释: row_number() over(): 是固定写法,即不能单独使用 row_nubmer() 函数; partition by: 可选的。用于指定分组(或分开依据)的列,类似 SELECT 中的 group by 子句; order by: 用于指定排序的列,类似 SELECT 中的 order by 子句。 1. 基本用法SELECT row_number() over(order by empno) AS rnum, t1.* FROM emp t1; 2. 使用 row_number() 分页 SELECT * FROM ( SELECT row_number() over(order by empno) AS rnum, t1.* FROM emp t1 ) t WHERE t.rnum BETWEEN 4 AND 6; 当使用 partition by 参数时,序号将可能不是唯一的,因为序号的生成只会在当前分区中唯一,下一个分区又将从1开始计算,例如: SELECT row_number() over(partition by deptno order by empno) AS rnum, t1.* FROM emp t1;
二、 rank() 与 dense_rank() 函数 rank() 与 row_number() 的区别在于,rank() 会按照排序值相同的为一个序号(以下称为:块),第二个不同排序值将显示所有行的递增值,而不是当前序号加1。看示例: SELECT rank() over(order by job) rnum, job, ename FROM emp t1;
而 dense_rank() 函数,与 rank() 区别在于,第二个不同排序值,是对当前序号值加1,看示例: SELECT dense_rank() over(order by job) rnum, job, ename FROM emp t1;
当指定 partition by 参数时,将根据指定的字段分组,进行分组计算序号值,序号值只在当前分组中有效,例如: SELECT rank() over(partition by deptno order by job) rnum, job, ename, deptno FROM emp t1;
SELECT dense_rank() over(partition by deptno order by job) rnum, job, ename, deptno FROM emp t1; 三、 over() 函数结合聚合函数的使用 SELECT empno, ename, sal, hiredate, COUNT(sal) OVER(ORDER BY hiredate DESC) count FROM emp;
SELECT empno, ename, sal, hiredate, MAX(sal) OVER(ORDER BY hiredate ASC) max FROM emp;
SELECT empno, ename, sal, hiredate, MIN(sal) OVER(ORDER BY hiredate DESC) min FROM emp; SELECT empno, ename, sal, hiredate, AVG(sal) OVER(ORDER BY hiredate DESC) avg FROM emp;
SELECT empno, ename, sal, hiredate, SUM(sal) OVER(ORDER BY hiredate DESC) sum FROM emp; 四、 综合案例 1) 查询前 100 条记录 SELECT * FROM emp WHERE rownum = 4 AND t.rnum |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |