`

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函数

    #### 五、OVER函数的高级用法 ##### 示例4:使用LAG()和LEAD()获取前后行数据 LAG()和LEAD()函数可以获取当前行前面或后面一行的数据。 ```sql SELECT employee_id, salary, department_id, LAG(salary, 1) OVER...

    Oracle开发的over函数

    ### Oracle开发中的OVER函数详解 #### 一、Oracle分析函数简介 在Oracle数据库开发中,分析函数是一类非常强大的工具,主要用于实现复杂的查询需求,尤其是在处理大量数据时,能够提供高级的数据汇总、排序和筛选...

    oracle分析函数(用法+实例)

    Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...

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

    ### Oracle分析函数OVER及开窗函数详解 #### 一、概述 在Oracle数据库中,分析函数(Analytic Functions)是一种非常强大的工具,用于处理复杂的查询需求。这些函数可以在一组相关的行上执行计算,并且每行返回一个...

    ORACLE中OVER函数的用法.doc

    ORACLE中OVER函数的用法.doc

    ORACLE分析函数

    根据提供的文件信息,我们可以深入探讨Oracle分析函数的相关知识点,特别是`SUM()`函数配合`OVER`子句的不同用法,以及`RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()` 这三个窗口函数的应用场景。 ### Oracle分析...

    Oracle分析函数基本概念和语法总结及Regexp_***用法

    Oracle分析函数是数据库管理系统Oracle中的一种高级查询工具,它们用于处理行集,计算基于特定窗口内的数据的聚合值。分析函数的主要特点是返回的结果不仅仅是一行,而是多行,这与传统的聚合函数(如SUM, AVG等)...

    ORACLE 分析函数大全

    Oracle 分析函数是一种强大的SQL工具,它允许你在处理数据时执行复杂的分析操作,而不像聚合函数那样仅仅返回单行结果。分析函数在Oracle 8.1.6版本中被引入,自那时起,它们已经成为数据库查询和报表生成的重要组成...

    oracle分析函数大全

    ### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它自Oracle 8.1.6版本开始引入,并在后续版本中不断完善和发展。...理解并熟练掌握这些函数的使用方法,将有助于更高效地完成数据处理任务。

    oracle分析函数及开窗函数

    通过本文的学习,我们了解了Oracle中的分析函数及其基本用法,包括常见的分析函数分类、基本语法以及实际应用场景。这些函数的强大之处在于它们能够轻松地处理复杂的数据计算需求,为数据分析提供了极大的便利。掌握...

    oracle 常用函数下载

    以下是一些常见的Oracle分析函数及其用法: 1. **开窗函数(Over)**: 开窗函数允许在一组行上执行计算,这组行被称为“窗口”,窗口可以基于特定的排序或分区条件。例如: - `OVER (ORDER BY salary)` 按薪资排序...

    oracle 分析函数学习笔记

    在描述中提到的场景中,有几种不同的方法可以实现数据统计,包括通过程序处理、使用临时表和包、标准SQL的UNION以及Oracle特有的分析函数。每种方法都有其优缺点。例如,程序处理方法与数据库无关,但增加了开发工作...

    oracle分析函数参考手册

    通过上述介绍,我们不仅了解了分析函数的基本用法,还探讨了如何利用开窗函数来定义不同类型的计算窗口,从而实现更高级的数据分析需求。掌握了这些技巧后,您可以更加高效地进行数据探索和洞察发现。

    Orcal中over函数.doc

    ### Oracle中OVER函数详解 #### 一、概述 在Oracle数据库中,OVER函数是一个非常强大的工具,主要用于实现复杂的窗口函数操作。它可以帮助我们对数据进行分组、排序、累计等多种处理,大大增强了SQL语言的数据分析...

    Oracle查询中OVER (PARTITION BY ..)用法

    Oracle查询中的`OVER (PARTITION BY ..)`是一个窗口函数,它允许我们在数据集上执行计算,但不是在整个结果集上,而是针对每个分区。这部分功能非常强大,可以用于复杂的分析和排序任务,尤其是在处理分组数据时。在...

    【Oracle】LISTAGG函数的使用.pdf

    1. 作为分析函数,类似于 row_number()、rank()、dense_rank() 等函数,使用方法相似: LISTAGG(合并字段, 连接符) WITHIN GROUP(ORDER BY 合并字段的排序) OVER(PARTITION BY 分组字段) 2. 作为聚合函数,类似于 ...

    oracle开窗函数学习技巧总结

    本文将重点介绍`OVER`函数及其相关用法,并通过具体的例子来帮助读者更好地理解和掌握这些技巧。 #### 二、`OVER`函数简介 `OVER`函数是Oracle开窗函数的核心组成部分,它定义了一个计算上下文或窗口,在这个窗口内...

    oracle分析函数row_number() over()使用

    下面我们将详细讨论`ROW_NUMBER() OVER()`的使用方法及其在不同场景下的应用。 首先,`ROW_NUMBER() OVER()`的基本语法是: ```sql ROW_NUMBER() OVER ( [PARTITION BY column1, column2, ...] ORDER BY column3...

    ORACLE分析函数.ppt

    在本文档中,我们将详细介绍 ORACLE 分析函数的使用和优化方法,并提供一些实用的示例代码和优化方案。同时,我们还将分析分析函数的优缺点,并讨论如何根据实际情况选择合适的分析函数。 1. 分析函数的优点 使用...

Global site tag (gtag.js) - Google Analytics