over(Partition by…) 一个超级牛皮的特有函数。

分析函数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
gfk 3 99
ddd 3 99
adf 3 45
asd 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
--
得到结果:
N

AME 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列值

=====
select * from test

数据:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6

—将B栏位值相同的对应的C 栏位值加总
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test

A B C C_SUM
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6

—如果不需要已某个栏位的值分割,那就要用 null

eg: 就是将C的栏位值summary 放在每行后面

select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test

A B C C_SUM
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17

求个人工资占部门工资的百分比

SQL> select * from salary;

NAME DEPT SAL


a 10 2000
b 10 3000
c 10 5000
d 20 4000

SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;

NAME DEPT SAL PERCENT


a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100

二:开窗函数
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
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)

常用的分析函数如下所列:

row_number() over(partition by … order by …)
rank() over(partition by … order by …)
dense_rank() over(partition by … order by …)
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 …)
first_value() over(partition by … order by …)
last_value() over(partition by … order by …)
lag() over(partition by … order by …)
lead() over(partition by … order by …)

示例
SQL> select type,qty from test;

TYPE QTY


1 6
2 9

SQL> select type,qty,to_char(row_number() over(partition by type order by qty))||’/’||to_char(count(*) over(partition by type)) as cnt2 from test;

TYPE QTY CNT2


3 1/2
1 6 2/2
2 5 1/3
7 2/3
2 9 3/3

SQL> select * from test;


1 11111
2 22222
3 33333
4 44444

SQL> select t.id,mc,to_char(b.rn)||’/’||t.id)e
2 from test t,
(select rownum rn from (select max(to_number(id)) mid from test) connect by rownum <=mid ))L
4 where b.rn<=to_number(t.id)
order by id

ID MC TO_CHAR(B.RN)||’/’||T.ID


1 11111 1/1
2 22222 1/2
2 22222 2/2
3 33333 1/3
3 33333 2/3
3 33333 3/3
44444 1/4 44444 2/4
4 44444 3/4CNOUG4 44444 4/4

10 rows selected


关于partition by

这些都是分析函数,好像是8.0以后才有的 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序) rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 lag(arg1,arg2,arg3): arg1是从其他行返回的表达式 arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 arg3是在arg2表示的数目超出了分组的范围时返回的值。

1.
select deptno,row_number() over(partition by deptno order by sal) from emp order by deptno;
2.
select deptno,rank() over (partition by deptno order by sal) from emp order by deptno;
3.
select deptno,dense_rank() over(partition by deptno order by sal) from emp order by deptno;
4.
select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from emp ord er by deptno;
5.
select deptno,ename,sal,lag(ename,2,’example’) over(partition by deptno order by ename) from em p
order by deptno;
6.
select deptno, sal,sum(sal) over(partition by deptno) from emp;–每行记录后都有总计值 select deptno, sum(sal) from emp group by deptno;
7. 求每个部门的平均工资以及每个人与所在部门的工资差额

select deptno,ename,sal ,
round(avg(sal) over(partition by deptno)) as dept_avg_sal,
round(sal-avg(sal) over(partition by deptno)) as dept_sal_diff
from emp;

over(Partition by…) 一个超级好用的特有(开窗)函数。相关推荐

  1. 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数

    http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ over(Partition by...) 一个超级牛皮的ORAC ...

  2. php 自定义超全局,一个超级简单的 PHP 超全局变量管理扩展

    一个超级简单的 PHP 超全局变量管理扩展(自卖自夸) 介绍 SG 全称 Superglobals,它的诞生为了方便快捷操作 PHP 预定义的超全局变量,用户定义的超全局变量. 如果在非 CLI 模式 ...

  3. 涅槃重生的下一个超级风口:8本书助你赢在未来

    导读:经济学家郎咸平发表文章<剥离货币属性,区块链涅槃重生--疫情下的区块链产业>,文中提到,未来,工业互联网和区块链的结合将是下一个超级风口.随着工业互联网连接规模的扩大,我们迫切需要通 ...

  4. 【Flink】FlinkConsumer是如何保证一个partition对应一个thread的

    1.概述 我们都知道flink 连接kafka时,默认是一个partition对应一个thread,它究竟是怎么实现的呢?以及到我们自己定义 RichParallelSourceFunction 的时 ...

  5. ShoeBox一个超级好用的图片切割工具

    ShoeBox一个超级好用的图片切割工具 两款图片切割工具 ShoeBox:http://renderhjs.net/shoebox/ BigShear:https://www.fancynode.c ...

  6. 【资源分享】一个超级方便的看电子书方法推荐

    [资源分享]一个超级方便的看电子书方法推荐 1.使用电子书网站 Zlibrary下载各类资源 Zlibrary全球最大数字图书馆,所有图书免费 | Tbox导航 Zlibrary 被称为 全球最大的数 ...

  7. Java一个超级简易的超市管理积分的系统

    第一步我们首先要想清楚思路,比如我们在超市消费的时候是不是每个人都会有一张会员卡,会员卡号都是随机生成的.然后客人凭借这个卡号去消费的时候累计积分 所以第一步我们建立一个关于用户的一个Class类 p ...

  8. 分享一个超级好用的文本编辑器,完爆曾经的np++

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 前言 大家好,我是ZhengN.本次给大家分享一个超级好用的. ...

  9. 微信正在变成另外一个超级浏览器

    微信账号是一个通行证.在一个用户数量庞大的体系中,腾讯构建起一个封闭式的,相对安全的一站式浏览器.腾讯站在了顶端,控制着这个封闭空间的开关,左下是用户,右下是内容提供者.目前内容的提供主要是腾讯的产品 ...

最新文章

  1. 什么是RNA-Seq (RNA Sequencing)
  2. 基于visual graph开发实时线损管理系统
  3. java中的常用日期类_Java中的常用日期类说明
  4. termux apache php,要啥自行车之Termux:将我们的(Android)安卓手机打造成全能的服务器...
  5. HTTP 请求之URLs 与 URNs
  6. 登录Ubuntu提示有软件包可以更新
  7. 异步与多线程的区别 线程安全 (总结)
  8. Ubuntu18网络配置
  9. 浅谈CTP期货行情交易API
  10. 洛谷P3533 [POI2012]RAN-Rendezvous
  11. 饥荒lisp_创建饥荒(Don't starve)专用服务器(Dedicated Server)遇到的问题
  12. linux系统编程界面实验报告,操作系统实验报告-Linux操作使用编程.doc
  13. 小白学python(爬虫知识1(大体框架)
  14. 干货 | “深耕内容”背景下,携程如何做景酒优质内容的挖掘
  15. 【架构师-系统设计】理解分布式系统的CAP和BASE理论
  16. 《工程电磁场》学习笔记1-静电场
  17. cubase10学习笔记
  18. html上传文件框架,文件上传 - FastAdmin框架文档 - FastAdmin开发文档
  19. VB.net数据库编程中DataGrid控件的使用技巧
  20. CSS学习Day2-字体和文本样式

热门文章

  1. 面对银发经济的崛起,品牌如何开展营销?
  2. Ubuntu登录设置,切换密码登录或是密钥登陆
  3. 计算机网络应用层协议分析总结
  4. linux upstart脚本,linux – 如何调试间歇性失败的upstart脚本?
  5. 天刀天命风流服务器所在位置,1月第二批 天刀天命风流大区合服公告
  6. 用Java实现opc通信协议
  7. React hooks之 useCallback的使用
  8. HttpOnly的设置
  9. 从Git安装、配置远程仓库到免输入密码推送一次搞掂
  10. how2J学习之Java多线程