`

oracle over函数用法

阅读更多
1,初始化脚本
create table emp(deptno varchar2(10),ename varchar2(20),sal number(10,0));

  insert into emp(deptno,ename,sal)values('20',trim('ADAMS   '),       1100   );
  insert into emp(deptno,ename,sal)values('30',trim('ALLEN   '),       1600   );
  insert into emp(deptno,ename,sal)values('30',trim('BLAKE   '),       2850   );
  insert into emp(deptno,ename,sal)values('10',trim('CLARK   '),       2450   );
  insert into emp(deptno,ename,sal)values('20',trim('FORD    '),      3000    );
  insert into emp(deptno,ename,sal)values('30',trim('JAMES   '),       950    );
  insert into emp(deptno,ename,sal)values('20',trim('JONES   '),       2975   );
  insert into emp(deptno,ename,sal)values('10',trim('KING    '),      5000    );
  insert into emp(deptno,ename,sal)values('30',trim('MARTIN  '),         1250 );   
  insert into emp(deptno,ename,sal)values('10',trim('MILLER  '),         1300 );   
  insert into emp(deptno,ename,sal)values('20',trim('SCOTT   '),       3000   );
  insert into emp(deptno,ename,sal)values('20',trim('SMITH   '),       800    );
  insert into emp(deptno,ename,sal)values('30',trim('TURNER  '),         1500 );  
  insert into emp(deptno,ename,sal)values('30',trim('WARD    '),      1250    );


2,具体用法
select * from (select deptno,
       ename,
       sal,
       --sum(sal) over(partition by deptno order by sal) --先按deptno分组,然后在分组内按sal排序逐个累加sal
       --sum(sal) over(order by deptno,ename)--按deptno,ename排序,逐个累加sal
       --sum(sal) over(order by ename)--按ename排序,逐个累加sal
       --sum(sal) over() --相当于sum(sal)
       --sum(sal) over (partition by deptno order by ename desc,sal desc)--先按deptno分组,然后在分组内按ename,sal倒序排序逐个累加sal
       row_number() over(/*partition by deptno*/ order by sal desc) row_n --按sal倒序排序得到行号
  from emp )
  where row_n between 1 and 3; --分页查询


3,分页方法
-- 正确方法1
select *
  from (select rownum row_num, a.*
          from (select t.* from emp t order by t.sal) a) b
 where b.row_num between 1 and 3;

-- 正确方法2,比方法1好一些
select *
  from (select rownum row_num, a.*
          from (select t.* from emp t order by t.sal) a
         where rownum <= 3) b
 where b.row_num >= 1;

-- 正确方法3,这三种分页方法性能几乎相等,如果非要分个高低:方法2 > 方法1 > 方法3,但方法3的写法最简洁,只需嵌套一层,前两种方法都必须嵌套两层
select *
  from (select row_number() over(order by t.sal) row_num, t.* from emp t) a
 where a.row_num between 1 and 3;

-- 错误方法4,这是典型的错误分页方法,数据库会先把数据select出来,这时rownum伪列根据默认顺序已经分配了数值,然后再进行order by,这样row_num顺序已经被打乱,此时的查询结果和order by前是一样的,依赖数据库默认select的结果顺序,一般数据库不保证每次select出来的顺序是一致的(当然绝大多数情况下是一致的,除非表数据做了整理)
select *
  from (select rownum row_num, t.* from emp t order by t.sal) a
 where a.row_num between 1 and 3;
0
0
分享到:
评论

相关推荐

    ORACLE的OVER函数使用技巧

    ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧

    oracle分析函数over_及开窗函数.txt

    oracle分析函数,oracle分析函数over_及开窗函数用法。

    ORACLE中OVER函数的用法.doc

    ORACLE中OVER函数的用法.doc

    ORACLE分析函数

    Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法 Oracle分析函数参考手册 开窗函数(over)详解

    Oracle中rank,over partition函数的使用方法

    本文主要介绍Oracle中rank,over partition函数的用法,希望对大家有所帮助。

    oracle常用分析函数与聚合函数的用法

    一、几个排名函数的语法和用法:  rank ( ) over ([partition by col] order by col ) dense_rank ( ) over ([partition by col] order by col ) rownumber ( ) over ( [partition by col] order by col ) ...

    Oracle开发之分析函数简介Over用法

    一、Oracle分析函数简介: 在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction Process),这些系统的特点是具备实时要求,或者至少说对响应的时间多长有一定的要求;其次这些系统的业务逻辑...

    oracle的row_numer()函数的使用

    介绍了 row_number() over(order by column asc) 函数和 row_number() over(partition by column1 order by column2 asc) 的使用实例和方法

    深入探讨:oracle中row_number() over()分析函数用法

    本篇文章是对oracle中row_number() over()分析函数的用法进行了详细的分析介绍,需要的朋友参考下

    Oracle中的SUM用法讲解

    Oracle中的SUM条件查询 1、按照区域编码分组查询区域编码、IPTV_NBR不为空的数量、ACC_NBR不为空的数量、所有用户数量 SELECT AREA_CODE, SUM ( CASE WHEN IPTV_NBR IS NULL or IPTV_NBR = '' THEN 0 ELSE 1 END ),...

    oracle排名函数的使用方法分享

    在oracle中,有rank,dense_rank,row_number,以及分组排名partition。 说明: rank:排名会出现并列第n名,它之后的会跳过空出的名次,例如:1,2,2,4 dense_rank:排名会出现并列第n名,它之后的名次为n+1,例如:1,2,...

    Oracle开发之报表函数

    一、回顾一下前面《Oracle开发之窗口函数》中关于全统计一节,我们使用了Oracle提供的: 代码如下:sum(sum(tot_sales)) over (order by month rows between unbounded preceding and unbounded following) 来统计...

    oracle分组排序统计高级用法

    oracle如何实现分组排序和统计、聚集,如何分组求top N,什么是over分析函数,row_number(),rank(),dense_rank()区别又是什么, 如何找到一条记录的前后值,这份文档写得太好了。

    Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

    ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序 而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的) RANK() 类似,不过RANK 排序的时候跟派名次一样,...

    oracle数据库经典题目

    2.如果一个服务器进程非正常终止,Oracle系统将使用下列哪一个进程来释放它所占用的资源?( D ) A.DBWR B.LGWR C. SMON D.PMON 3. 如果要查询数据库中所有表的信息,应当使用下列哪种数据字典视图?( A ) A. ...

Global site tag (gtag.js) - Google Analytics