分析函数之开窗函数over

一、分析函数
-- Oracle从8.1.6开始提供分析函数,专门用于解决复杂报表统计需求的功能强大的函数,
-- 它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。分析函数用于计算基于组的某种聚合值。

-- 它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。普通的聚合函数用group by分组,
-- 每个分组返回一个统计值;而分析函数采用partition by分组,并且每组每行都可以返回一个统计值。

-- 1、分析函数的形式:
-- 分析函数带有一个开窗函数over(),在窗口函数中包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,
-- 他们的使用形式如下:over(partition by xxx order by yyy rows between zzz)。
-- 注:窗口子句在这里我只说rows方式的窗口,range方式和滑动窗口也不提。

-- 例如:统计函数+over()、排序函数+over()、数据分布函数+over()、统计分析函数+over()。

-- 2、开窗函数:
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能/*会随着行的变化而变化*/。例如over函数

二、窗口函数
-- 窗口函数中常用的子句有:分区(partition by)、排序(order by)、范围(rows between或range between),
-- 以及她们的混合方式。形式如下:over(partition by xxx order by yyy rows between zzz)

三、常见分析函数
-- row_number() over(partition by … order by …)
-- rank() over(partition by … order by …)
-- dense_rank() over(partition by … order by …)
select deptno,sal,row_number() over(partition by deptno order by sal) num
,rank() over(partition by deptno order by sal) rank
,dense_rank() over(partition by deptno order by sal) dens from emp;

-- count() over(partition by … order by …)
-- max() over(partition by … order by …)
-- min() over(partition by … order by …)
-- sum() over(partition by … order by …)
-- avg() over(partition by … order by …)
select deptno,
       sal,
       count(sal) over(partition by deptno order by sal) cn,
       max(sal) over(partition by deptno order by sal) mx,
       min(sal) over(partition by deptno order by sal) mn,
       avg(sal) over(partition by deptno order by sal) ag,
       sum(sal) over(partition by deptno order by sal) sm
  from emp;

-- first_value() over(partition by … order by …)
-- last_value() over(partition by … order by …)
select deptno,sal,first_value(sal) over(partition by deptno order by sal) first
,last_value(sal) over(partition by deptno order by sal) last from emp;

-- lag() over(partition by … order by …)
-- lead() over(partition by … order by …)
-- Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。语法:lag(exp_str,offset,defval) over()
-- exp_str 是要做对比的字段;
-- offset 是exp_str字段的偏移量 比如说 offset 为2 则 拿exp_str的第一行和第三行对比,第二行和第四行,依次类推,offset的默认值为1!
-- defval是当该函数无值可用的情况下返回的值。Lead函数的用法类似。
select deptno,
       sal,
       job,
       lag(job,2,1) over(partition by deptno order by sal) lg
  from emp;

原文链接https://lanjingling.github.io/2015/10/09/oracle-fenxihanshu-2/

原文地址:https://www.cnblogs.com/ls11736/p/9284901.html

时间: 2024-11-08 19:37:28

分析函数之开窗函数over的相关文章

Oracle中的over(partition by...)分析函数及开窗函数

假设有一张表student Name  Score  InsertTime   (Name:姓名  Score:成绩 InsertTime:考试时间) 张三     20    2015-08-08 李四  12 2015-09-01 小Q     33      2015-09-03 张三     20    2015-09-08 李四  12 2015-07-01 小Q      25      2015-06-03 现在要求每个人按照考试时间的先后顺序进行排序,请写出oracle语句 答:

oracle的分析函数over 及开窗函数

转:http://www.2cto.com/database/201310/249722.html 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行. 下面通过几个例子来说明其应用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Oacle 开窗函数 分析函数

http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ over(Partition by...) 一个超级牛皮的ORACLE特有函数. 天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊! oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对

oracle分析函数技术详解(配上开窗函数over())

一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同之处是什么?普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值. 分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(or

SQL开窗函数

开窗函数:在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成.为了解决这些问题,在 2003 年 ISO SQL 标准加入了开窗函数,开窗函数的使用使得这些经典的难题可以被轻松的解决.目前在 MSSQLServer.Oracle.DB2 等主流数据库中都提供了对开窗函数的支持,不过非常遗憾的是 MYSQL 暂时还未对开窗函数给予支持. 开窗函数简介:与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值

深入浅出谈开窗函数(一)

      在开窗函数出现之前存在着非常多用 SQL 语句非常难解决的问题,非常多都要通过复杂的相关子查询或者存储过程来完毕.为了解决这些问题,在2003年ISO  SQL标准增加了开窗函数,开窗函数的使用使得这些经典的难题能够被轻松的解决.眼下在 MSSQLServer.Oracle.DB2 等主流数据库中都提供了对开窗函数的支持,只是非常遗憾的是 MYSQL 临时还未对开窗函数给予支持.  为了更加清楚地理解,我们来建表并进行相关的查询(截图为MSSQLServer中的结果)        

开窗函数 --over()

一个学习性任务:每个人有不同次数的成绩,统计出每个人的最高成绩. 这个问题应该还是相对简单,其实就用聚合函数就好了. select id,name,max(score) from Student group by id,name order by name 上边这种情况只适用id 和name是一一对应的,否则查询出来的数据是不正确的. 例如 : 1 张三 100 2 张三 90 查询出来的结果 两条信息都会输出. 避免这种情况,可以使用开窗函数. 个人理解就是,开窗函数和聚合函数功能是相反的.

SQL SERVER开窗函数

SQL SERVER开窗函数 总结的很好,转来做个笔记. 转自:http://www.cnblogs.com/csdbfans/p/3504845.html 今天将要介绍SQL Sever的开窗函数,何谓开窗函数,不懂吧.反正对于我来说,我是摸不着头脑了,第一次听说过.那么,什么是开窗函数,其实可以理解为是聚合函数的一个加强版.因为使用聚合函数的话(不包括子查询的情况),整个查询都只能是聚合列返回值,而不能有基础行的返回值.那么对于需要基础行的返回值的话,就需要使用复杂的子查询或者是存储过程等才

[转]Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数

oracle的分析函数over 及开窗函数 一:分析函数Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行. 下面通过几个例子来说明其应用. 1:统计某商店的营业额. date       sale 1           20 2           15 3           14 4           18 5           30 规则:按天统计:每天都统计前面几天的总额 se