OVER的定义
OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。

OVER的语法
OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )
PARTITION BY 子句进行分组;
ORDER BY 子句进行排序。
窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。
开窗函数不需要使用GROUP BY就可以对数据进行分组,还可以同时返回基础行的列和聚合列。

OVER的用法
OVER开窗函数必须与聚合函数或排序函数一起使用,聚合函数一般指SUM(),MAX(),MIN,COUNT(),AVG()等常见函数。排序函数一般指RANK(),ROW_NUMBER(),DENSE_RANK(),NTILE()等。
OVER在聚合函数中使用的示例
我们以SUM和COUNT函数作为示例来给大家演示。
–建立测试表和测试数据

CREATE TABLE Employee
(
ID INT  PRIMARY KEY,
Name VARCHAR(20),
GroupName VARCHAR(20),
Salary INT
)
INSERT INTO  Employee
VALUES(1,'小明','开发部',8000),  (4,'小张','开发部',7600),  (5,'小白','开发部',7000),    (8,'小王','财务部',5000),  (9, null,'财务部',NULL),  (15,'小刘','财务部',6000),  (16,'小高','行政部',4500),  (18,'小王','行政部',4000),  (23,'小李','行政部',4500),  (29,'小吴','行政部',4700);

SUM后的开窗函数

SELECT *,SUM(Salary) OVER(PARTITION BY Groupname) 每个组的总工资,SUM(Salary) OVER(PARTITION BY groupname ORDER BY ID) 每个组的累计总工资,SUM(Salary) OVER(ORDER BY ID) 累计工资,SUM(Salary) OVER() 总工资
from Employee  ;

其中开窗函数的每个含义不同,我们来具体解读一下:
SUM(Salary) OVER (PARTITION BY Groupname)
只对PARTITION BY后面的列Groupname进行分组,分组后求解Salary的和。
SUM(Salary) OVER (PARTITION BY Groupname ORDER BY ID)
对PARTITION BY后面的列Groupname进行分组,然后按ORDER BY 后的ID进行排序,然后在组内对Salary进行累加处理。
SUM(Salary) OVER (ORDER BY ID)
只对ORDER BY 后的ID内容进行排序,对排完序后的Salary进行累加处理。
SUM(Salary) OVER ()
对Salary进行汇总处理

窗口函数进阶-根据时间范围统计:range … interval day
前面我们说过,窗口函数不单适用于指定记录集进行统计,而且也能适用于指定范围进行统计的情况,例如下面这个SQL语句就统计了当天销售额和五天内的评价销售额:

select trunc(order_dt) day,sum(sale_price) daily_sales,avg(sum(sale_price)) over (order by trunc(order_dt)range between interval '2' day preceding and interval '2' day following) five_day_avgfrom cust_orderwhere sale_price is not null and order_dt between to_date('01-jul-2001','dd-mon-yyyy')and to_date('31-jul-2001','dd-mon-yyyy')

为了对指定范围进行统计,Oracle使用关键字range、interval来指定一个范围。上面的例子告诉Oracle查找当前日期的前2天,后2天范围内的记录,并统计其销售平均值。

窗口函数进阶-first_value/last_value:

Oracle提供了2个额外的函数:first_value、last_value,用于在窗口记录集中查找第一条记录和最后一条记录。假设我们的报表需要显示当前月、上一个月、后一个月的销售情况,以及每3个月的销售平均值,这两个函数就可以派上用场了。

select month,first_value(sum(tot_sales)) over (order by month rows between 1 preceding and 1 following) prev_month,sum(tot_sales) monthly_sales,last_value(sum(tot_sales)) over (order by month rows between 1 preceding and 1 following) next_month,avg(sum(tot_sales)) over (order by month rows between 1 preceding and 1 following) rolling_avgfrom orderswhere year = 2001 and region_id = 6group by monthorder by month;

首先我们来看:rows between 1 preceding and 1 following告诉Oracle在当前记录的前一条、后一条范围内查找并统计,而first_value和last_value在这3条记录中至分别找出第一条、第三条记录,这样我们就轻松地得到相邻三个月的销售记录及平均值了!

Oracle开窗函数over()的用法相关推荐

  1. ORACLE ---开窗函数

    ORACLE -开窗函数 开窗函数: (又名:分析函数,窗口函数,OLAP函数) 开窗函数: 将数据按照一定的规则分组,统一分析各组的某项情况,每行数据返回一行结果 OLTP:事务处理 OLAP:数据 ...

  2. oracle开窗函数是什么,ORACLE数据库(六)-----开窗函数

    ORACLE数据库(六)-----开窗函数 开窗函数又名分析函数.窗口函数.OLAP(数据分析)函数 聚合函数:将数据按照一定的规则分组,统一分析各组的某项情况,每个分组返回一行结果 开窗函数:将数据 ...

  3. Oracle 开窗函数--转

    oracle的分析函数over 及开窗函数 转自:http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ 一:分析函数ov ...

  4. oracle rollup 排序,Oracle分组函数之ROLLUP用法

    rollup函数 本博客简单介绍一下oracle分组函数之rollup的用法,rollup函数常用于分组统计,也是属于oracle分析函数的一种 环境准备 create table dept as s ...

  5. oracle开窗函数有哪些,oracle分析函数理解(开窗函数)

    作为一个数据库管理员可以不知道分析函数,但是开发dba还是需要了解的.有时候即使经常写sql的也很少用到的分析函数. 在优化sql 的过程中,经常遇到一些通过编写复杂的sql 来实现分析函数功能的sq ...

  6. oracle trunc年,Oracle TRUNC函数的正确用法

    关于对Oracle TRUNC函数的相关实知识,我现在总算有点体会了,如果某天你要想在实际操作中要用trunc(date,''dd'').时,你可以打开这篇文章对其进行一个更为全面的了解,以下就是文章 ...

  7. sum 开窗函数 oracle,oracle开窗函数案例详解

    一.建表和数据准备 create table t_window( name varchar2(32), orderdate varchar2(32), cost varchar2(32) ) sele ...

  8. ORACLE中函数last_day()的用法

    https://blog.csdn.net/jiangnan2014/article/details/14805861

  9. Oracle日期函数months_between的用法

    select months_between(sysdate,to_date('2015-08-14','yyyy/mm/dd')) from dual months_between(参数1,参数2), ...

最新文章

  1. sublimeformaya
  2. ITK:比较两个图像并将输出像素设置为最小值
  3. 阶段总结——201511
  4. 使用JDK自带的jmap和jhat监控处于运行状态的Java进程
  5. Linux性能优化方向及相关工具
  6. 从程序员到CTO也可以走捷径
  7. 安全高效的中小型网络
  8. 【DFS】Gym - 100781A - Adjoin the Networks
  9. php让手机全屏,手机网站按比例显示铺满手机全屏/网站两边不留白
  10. 密码学的中文入门书籍及课程推荐
  11. 新学期,我的目标与展望。(中秋快乐)
  12. 电脑水冷风扇转速太高怎么调?
  13. AudioPlayer-简易音频播放器
  14. Java训练work3.Exer2---跳跃最大长度
  15. Linux进程中Dec04什么意思,用last命令时会总显示些crash,
  16. “云办公”如何用任务协同工具搞定项目和团队管理?
  17. 尚德自考的销售策略,尚德的陷阱,尚德是如何欺骗消费者的,315刚过,尚德就可以这样?
  18. 介于普通母函数和指数母函数之间的应用
  19. 一文了解加解密、哈希函数、MAC、数字签名、证书、CA等
  20. 指定的参数已超出有效值的范围,参数名:site解决办法。

热门文章

  1. 留良乡投资理财知识怎么入门
  2. JAVA实现通过绑定邮箱找回密码功能
  3. 程序员也应了解的Unity粒子系统
  4. 树莓派Linux系统内核源码下载方式
  5. [Android] Adobe Photoshop Express 手机上用的挺好的作图软件
  6. MTD 设备驱动 和 NAND Flash 驱动程序分析。
  7. Android 圆角闪光遮照效果
  8. 歌曲:隐形的翅膀 歌手:张韶涵
  9. 什么是ABI? Swift ABI稳定有什么用?
  10. 《gathertool开发使用文档》