搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
从前慢现在也慢
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
10个AI绘图生成器让绘画更简单_ai绘画生成工具
2
一起打造漂亮的Ubuntu——2023最新版Gnome44_gnome主题
3
预训练模型的分类,以及代表模型介绍
4
TensorRT_tensorrt和cuda的区别
5
Chrome查看图片base64_谷歌显示base64图片
6
【PostgreSQL】PostgreSQL容量相关查询_查询pg库各模式大小
7
VUEX的理解_使用vuex的优点和缺点是什么
8
GPU多卡并行训练总结(以pytorch为例)
9
JProfiler-----入门使用_jprofiler 最大对象
10
【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【3】:色彩空间_opencv4计算机视觉:pyhon
当前位置:
article
> 正文
Oracle 分析函数及开窗函数 解析_oracle开窗函数资源消耗
作者:从前慢现在也慢 | 2024-03-15 13:11:59
赞
踩
oracle开窗函数资源消耗
一:分析函数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列值
=====
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;
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/241130
推荐阅读
article
oracle
access
manager
token
,
OIDC
User Manager Acce...
应用介绍Asimplechromeextensiontoone-clickcopy
access
token
sfromweb...
赞
踩
article
Oracle
Database Server Messages(二) ._
primary
recei...
Skip Headers
Oracle
9i Database Error MessagesRelease 2 (9.2)P...
赞
踩
article
【
方向盘
】逐渐碎片化的
Java
生态圈:
Oracle
JDK
、Open
JDK
、阿里
Dragonwell
...
Oracle
JDK
开始收费后,我们还能用什么?_龙井
jdk
龙井
jdk
...
赞
踩
article
oracle
varchar2
字
段
关联
,联机重定义修改
字
段类型(N
VARCHAR2
->VARCHA...
今天在调整一个SQL的时候发现有一个表使用了N
VARCHAR2
字
段类型,在于
VARCHAR2
类型的
字
段连接时发生隐式转换...
赞
踩
article
解决安装
虚拟
机
(
VM
ware
/
Oracle
VM
VirtualBox)后电脑没有
虚拟
网卡的问题_v...
打开CCleaner后如图选择注册表以后选定所有选项一般默认都是选择的,然后进行扫描问题,等扫描完成后查看选定问题(其中...
赞
踩
article
Mysql
oracle
关联
查询_
Mysql
,
Oracle
表
的
字段
关联
另一个表
的
字段并以逗号分隔
,
...
在设计数据库表时
,
当有
关联
另外
的
一张表时
,
我们会将另一个表
的
主键
,
以逗号分隔存在主表
的
一个字段里。当用mysql数据库时...
赞
踩
article
Oracle
表
的
字段
关联
另
一个
表
的
字段并以
逗号
分隔
,
关联
查询_
orace
根据
逗号
分隔
去
关联
查询另...
在设计数据库表时,当有
关联
另外
的
一张表时,我们会将另
一个
表
的
主键,以
逗号
分隔
存在主表
的
一个
字段里。当用mysql数据库时...
赞
踩
article
oracle
replace
_
ORACLE实现类似
mysql
的
f
in
d
_
in
_
set...
对于豆号分隔开的字段进行搜索,最方便的是
mysql
数据库了直接使用
f
in
d
_
in
_
set 就搞定了,而作者使用的是ora...
赞
踩
article
Oracle
SQL Replace Regexp_Replace方法_
oracle
regexp
_...
替换字符的方法:使用场景: 1.替换特殊字符:替换制表符,换行符...等等 2. 替换很繁琐的业务,比如替换所有数字,所...
赞
踩
article
plsql
oracle
函数
regexp
_
replace
字符的处理案例
_
regexp
_
replac...
先吐槽一波,现在开发一个使用中的后台,其中有多个金额字段的类型是varchar2,并且里面有非数字字段,导致我累加的时候...
赞
踩
article
Oracle
查询
技巧与优化(三)
字符串
操作_
字符串
每三位加
逗号
oracle
...
关于
Oracle
查询
优化的相关
字符串
操作以及常用的
字符串
函数~_
字符串
每三位加
逗号
oracle
字符串
每三位加
逗号
orac...
赞
踩
article
Oracle
查询
技巧与优化(二) 多
表
查询
_
oracle
多次关联字典
表
...
关于
Oracle
多
表
查询
的一些技巧和优化~_
oracle
多次关联字典
表
oracle
多次关联字典
表
...
赞
踩
article
Oracle
-
字符串
处理_
oracle
字符串
处理...
Oracle
中的
字符串
处理方式_
oracle
字符串
处理
oracle
字符串
处理 ...
赞
踩
article
Oracle
-
1.1
.
字
符串
_
oracle
字
段包含
字
符串
...
oracle
-
1.1
.
字
符串
_
oracle
字
段包含
字
符串
oracle
字
段包含
字
符串
1.or...
赞
踩
article
oracle
每
3
位加
逗号
,
ORACLE
一句话问答(三)...
1、如何按执行顺序查看执行计划:select id
,
parent_id
,
operationfrom (select le...
赞
踩
article
Oracle——
SUBSTR
()
截取
字符串
,
INSTR
()
查找
字符串
_
oracle
截取
...
3.长度:中间位置长度不确定,所以
查找
第二个分隔符位置减去开始位置得。组合使用可以
截取
两个字符中间的
字符串
,下面例子从字...
赞
踩
article
Oracle
查询
技巧与优化(一) 单
表
查询
与
排序
_
oracle
联查
表
顺序
对
查询
销量...
关于
Oracle
单
表
查询
与
排序
相关的技巧与优化~_
oracle
联查
表
顺序
对
查询
销量
oracle
联查
表
顺序
对
查询
销...
赞
踩
article
oracle
每
3
位加
逗号
,[DB][
Oracle
]
Oracle
格式化数字的方法(指定
小数点
位数
,
每...
to_char
,
函数功能
,
就是将数值型或者日期型转化为字符型。比如最简单的应用:/*1.012
3
--->'1.012
3
'...
赞
踩
article
oracle
sql
格式化
金额
(三位加逗号),如 12
,
222
,
210.73
_
sql
去
金额
格式...
select to_char(12222
210.73
,
'999
,
999
,
999
,
999
,
999.99') from d...
赞
踩
article
oracle
sql
格式化
价格 为三位加逗号,如 12
,
222
,
210.73
_
oracle
字符...
废话不多说,直接上
sql
语句: select to_char(12222
210.73
,
'999
,
999
,
999
,
999...
赞
踩
相关标签
oracle access manager token
java
JDK
OpenJDK
Oracle
Dragonwell
oracle varchar2 字段关联
hadoop
sql
数据库
Mysql oracle关联查询
oracle
insrt
oracle replace
oracle rownum
replace oracle
Oracle字符串
多表查询
database
oracle 每3位加逗号