分析函数over 及开窗函数

一:分析函数over

Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是

对于每个组返回多行,而聚合函数对于每个组只返回一行。

下面通过几个例子来说明其应用。

1:统计某商店的营业额。

date      sale

1          20

2          15

3          14

4          18

5          30

规则:按天统计:每天都统计前面几天的总额

得到的结果:

DATE  SALE      SUM

----- -------- ------

1     20       20          --1天

2     15       35          --1天+2天

3     14       49          --1天+2天+3天

4     18       67           .

5     30       97           .

2:统计各班成绩第一名的同学信息

NAME  CLASS S

----- ----- ----------------------

fda   1     80

ffd   1     78

dss   1     95

cfe   2     74

gds   2     92

gf    3     99

ddd   3     99

adf   3     45

asdf  3     55

3dd   3     78

通过:

--

select * from

(

select name,class,s,rank()over(partition by class order by s desc) mm from t2

)

where mm=1

--

得到结果:

NAME  CLASS S                      MM

----- ----- ---------------------- ----------------------

dss   1     95                     1

gds   2     92                     1

gf    3     99                     1

ddd   3     99                     1

注意:

1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果

2.rank()和dense_rank()的区别是:

--rank()是跳跃排序,有两个第二名时接下来就是第四名

--dense_rank()l是连续排序,有两个第二名时仍然跟着第三名

3.分类统计 (并显示信息)

A  B  C

-- -- ----------------------

m  a  2

n  a  3

m  a  2

n  b  2

n  b  1

x  b  3

x  b  2

x  b  4

h  b  3

select a,c,sum(c)over(partition by a) from t2

得到结果:

A  B  C       SUM(C)OVER(PARTITIONBYA)

-- -- ------- ------------------------

h  b  3       3

m  a  2       4

m  a  2       4

n  a  3       6

n  b  2       6

n  b  1       6

x  b  3       9

x  b  2       9

x  b  4       9

如果用sum,group by 则只能得到

A  SUM(C)

-- ----------------------

h  3

m  4

n  6

x  9

无法得到B列值

=====

二:开窗函数

开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:

1:

over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数

over(partition by deptno)按照部门分区

2:

over(order by salary range between 5 preceding and 5 following)

每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5

例如:对于以下列

aa

1

2

2

2

3

4

5

6

7

9

sum(aa)over(order by aa range between 2 preceding and 2 following)

得出的结果是

AA                      SUM

---------------------- -------------------------------------------------------

1                      10

2                      14

2                      14

2                      14

3                      18

4                      18

5                      22

6                      18

7                      22

9                      9

就是说,对于aa=5的一行 ,sum为  5-1<=aa<=5+2 的和

对于aa=2来说 ,sum=1+2+2+2+3+4=14    ;

又如 对于aa=9 ,9-1<=aa<=9+2 只有9一个数,所以sum=9   ;

3:其它:

over(order by salary rows between 2 preceding and 4 following)

每行对应的数据窗口是之前2行,之后4行

4:下面三条语句等效:

over(order by salary rows between unbounded preceding and unbounded following)

每行对应的数据窗口是从第一行到最后一行,等效:

over(order by salary range between unbounded preceding and unbounded following)

等效

over(partition by null)

oracle统计每个类别,Oracle统计分析函数集之一相关推荐

  1. oracle的集函数,Oracle统计分析函数集之一(转载)

    分析函数over 及开窗函数 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返 ...

  2. oracle 月累计,oracle 可有什么方法 统计每月累积购买人数?

    oracle 可有什么方法 统计每月累积购买人数? oracle 可有什么方法 统计每月累积购买人数 比如说有个门店 2008年购买商品的人数 表:t_buy_log  字段 f_username 用 ...

  3. oracle stalestats_深入理解oracle优化器统计数据(Optimizer Statistics)

    理解oracle优化器统计数据 首先来介绍oracle数据库使用基于规则优化器(RBO)来决定如何执行一个sql语句.基于规则优化器顾名思义,它是遵循一组规则来判断一个sql语句的执行计划.这组规则是 ...

  4. oracle数据库直方图,[转] oracle统计信息(statistics)和直方图(histogram)

    oracle统计信息和直方图的理解 以前一直对统计信息的理解就是对行的数据分布的,提供改CBO来选择高效的执行计划.这段时间看了不少资料,对统计有了一个更清晰的认识 统计信息: 1,表中的统计信息 2 ...

  5. Oracle 12c数据库优化器统计信息收集的最佳实践

    Oracle 12c数据库优化器统计信息收集的最佳实践 转载自     沃趣科技(ID:woqutech) 作者         刘金龙(译) 原文链接   http://www.oracle.com ...

  6. oracle并行收集统计信息慢,Oracle 学习之性能优化(四)收集统计信息

    emp表有如下数据.SQL> select ename,deptno from emp; ENAME   DEPTNO ------------------------------ ------ ...

  7. oracle不连续得时间如何分组,Oracle按不同时间分组统计的sql

    Oracle按不同时间分组统计的sql以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Oracle按不同时间分组统计的s ...

  8. oracle按用户采集信息,oracle 11g 手动收集用户统计信息

    oracle 11g 手动收集用户统计信息 2020-07-25 编程之家收集整理的这篇文章主要介绍了oracle 11g 手动收集用户统计信息,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个 ...

  9. oracle中有没有=,在oracle中有没有方式来实现这样的统计啊?

    在oracle中有没有方式来实现这样的统计? 有这样的三张表,记录表(id,compid 单位编号,happentime 发生时间,protypeid 问题类型),问题类型表(proid,--),单 ...

最新文章

  1. 汪潮涌:AI创业落地为王,技术和算法难以成为核心壁垒
  2. + ,- (加号,减号) 是数字类型吗?(sql server 2000中)
  3. 通知:Spring Cloud Alibaba 仓库迁移
  4. 工业计算机断层扫描原理,工业计算机断层扫描(CT).doc
  5. 【推荐一位Python大佬】 从程序员到创业者,再到自由职业
  6. Python学习:numpy点乘,按元素相乘,以及转置的处理
  7. 分布式锁实现原理与最佳实践
  8. 董老师又双叒叕送书啦,8本《Python网络程序设计(微课版)》
  9. struts学习笔记(一):Struts相关基础理论介绍
  10. c# 条件编译 Conditional (DEBUG)
  11. 区块链技术从入门到精通教程
  12. Base64对图片进行编码解码
  13. Pytorch:三、数据的迭代训练(猫狗)
  14. 【重识云原生】第六章容器6.3.5节——Controller Manager概述
  15. 【电商项目实战】个人资料(详细篇)
  16. 唯样商城:扩展用于汽车以太网的 ESD 保护解决方案产品组合
  17. 2022考研写作不过如此pdf电子版
  18. webmatrix(WebMatrix升级)
  19. 微型计算机原理push指令,微机原理指令英文解释
  20. 阿里巴巴升级生意参谋 大数据为电商赋能

热门文章

  1. 简单分享apache封IP的方法
  2. Spark 广播变量和累加器
  3. JavaScript笔记杂谈篇(啥都有)
  4. 《计算机网络基础》考试大纲
  5. 【Pro ASP.NET MVC 3 Framework】.学习笔记.4.MVC的主要工具-使用Moq
  6. 手动绘制DataTable
  7. Failed to restart docker.service: Unit is masked.真正的解决办法
  8. 2018修复激活闪退_IOS越狱后和平精英闪退、黑屏、10min封号的解决办法!
  9. 设备驱动模型与sysfs
  10. IP与子网掩码的计算