- 浏览: 66014 次
- 性别:
- 来自: 成都
最新评论
-
jianqiangking:
java实现从ftp服务器上下载文件 -
jianqiangking:
请问fileUrl的值怎么写?
java实现从ftp服务器上下载文件 -
jianqiangking:
请问fileUrl 属性的值怎么写?
java实现从ftp服务器上下载文件 -
qgyang:
刚好碰到这种问题,非常感谢!
一个服务器中配置多个tomcat -
wangacidlemon:
实际运用中这个书写代码的方式是不被推荐的。继承应当是继承抽象类 ...
父类子类的初始化顺序问题
oracle的分析函数over 及开窗函数 数据: A B C C_SUM ---如果不需要已某个栏位的值分割,那就要用 null eg: 就是将C的栏位值summary 放在每行后面 select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum A B C C_SUM 求个人工资占部门工资的百分比 SQL> select * from salary; NAME DEPT SAL SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary; NAME DEPT SAL PERCENT 二:开窗函数 SQL> select n1,v1,nid,sum(nid) over(order by nid) as sum
N1
V1
NID SUM 取nid列的累积和,
即下面以emp表为例的按部门“连续”求总和 ================================================================== 按v1分组取nid的和
SQL> select v1,sum(nid) over (partition by v1 order by v1) as sum_nid from t1;
V1 SUM_NID 按v1分组取nid的和,并重复行只显示一行
SQL> select distinct * from (select v1,sum(nid) over (partition by v1) as sum_nid
from t1);
V1 SUM_NID ================================================================== 再以emp为例 使用子分区查出各部门薪水连续的总和。注意按部门分区 over(...)条件的不同 sql> break on deptno skip 1 -- 为效果更明显,把不同部门的数据隔段显示。
SQL> select deptno,ename,sal, DEPTNO
ENAME
SAL 部门连续求和 部门总和
部门份额 总和
连续求和 总份额
---------- ---------- ---------- ------------ ---------- ---------- ---------- ---------- ----------
10
CLARK
2450
2450
8750
28
29025
2450 8.44
KING
5000
7450
8750 57.14
29025
7450 17.23
MILLER
1300
8750
8750 14.86
29025
8750 4.48
FORD
3000
4100 10875
27.59 29025
12850 10.34
JONES
2975
7075 10875
27.36 29025
15825 10.25
SCOTT
3000
10075 10875
27.59 29025
18825 10.34
SMITH
800
10875
10875
7.36 29025
19625 2.76
BLAKE
2850
4450
9400 30.32
29025
24075 9.82
JAMES
950
5400
9400 10.11
29025
25025 3.27
MARTIN
1250
6650
9400
13.3 29025
26275 4.31
TURNER
1500
8150
9400 15.96
29025
27775 5.17
WARD
1250
9400
9400
13.3 29025
29025 4.31 已选择14行。 综合的例子,求和规则有按部门分区的,有不分区的例子 SQL> select deptno,ename,sum(sal) over(partition by deptno order by sal) as sum_sal, DEPTNO ENAME SUM_SAL SUM_DEPT_SAL
20
SMITH
800 9550
30
JAMES
950 20575 来一个逆序的,即部门从大到小排列,部门里各员工的薪水从高到低排列,累计和的规则不变。
SQL> select deptno,ename,sal, DEPTNO
ENAME
SAL SUM_SAL_ORDER SUM
20
SCOTT
3000
6000 15400
10
KING
5000
5000 25275
一:分析函数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
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6
from test
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17
---------- ---- -----
a 10 2000
b 10 3000
c 10 5000
d 20 4000
---------- ---- ----- ----------
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)
分类:sql语句
2 from t1;
---------- ---------- ---------- ----------
1
aa
61 61
2
aa
62 123
3
aa
63 186
4
aa
64 250
---------- ----------
aa 187
aa 187
aa 187
bb 83
---------- ----------
aa 187
bb 83
sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和
sum(sal) over (partition by deptno) 按部门求总和
sum(sal) over (order by deptno,ename) 不按部门“连续”求总和
sum(sal) over () 不按部门,求所有员工总和,效果等同于sum(sal)。
2 sum(sal) over (partition by deptno order by ename) 部门连续求和,
3 sum(sal) over (partition by deptno) 部门总和,
4 100*round(sal/sum(sal) over (partition by deptno),4) 部门份额,
5 sum(sal) over () 总和,
6 sum(sal) over (order by deptno,ename) 连续求和,
7 100*round(sal/sum(sal) over (),4) 总份额
8 from emp;
20
ADAMS
1100
1100 10875
10.11
29025
9850 3.79
30
ALLEN
1600
1600
9400 17.02
29025
21225 5.51
2 sum(sal) over(order by deptno,sal) as sum_dept_sal
3 from emp;
---------- ---------- ---------- ------------
10 MILLER
1300 1300
CLARK
3750 3750
KING
8750 8750
ADAMS
1900 10650
JONES
4875 13625
SCOTT
10875 19625
FORD
10875 19625
WARD
3450 23075
MARTIN
3450 23075
TURNER
4950 24575
ALLEN
6550 26175
BLAKE
9400 29025
已选择14行。
2 sum(sal) over
(partition by deptno order by deptno desc,sal desc) as sum_sal_order,
3 sum(sal) over (order by deptno desc,sal desc) as sum
4 from emp;
---------- ---------- ---------- ------------- ----------
30
BLAKE
2850
2850 2850
ALLEN
1600
4450 4450
TURNER
1500
5950 5950
WARD
1250
8450 8450
MARTIN
1250
8450 8450
JAMES
950
9400 9400
FORD
3000
6000 15400
JONES
2975
8975 18375
ADAMS
1100
10075 19475
SMITH
800
10875 20275
CLARK
2450
7450 27725
MILLER
1300
8750 29025
已选择14行。
发表评论
-
oracle 设置默认值无效(转)
2013-03-18 16:28 1065几天前有人问我设置 ... -
Excel数据通过plsql 导入到Oracle(转)
2012-03-01 22:40 9731 准备Excel导入数据 2 把Excel文件另存为( ... -
主外键相关查询
2012-02-29 19:52 814有时在删除某一表时发现有外键约束不能删除,隐藏需要先删除外键对 ... -
DMP文件更换表空间的方法
2011-12-05 16:29 1362从一个数据库中导出来的dmp文件,它的表空间是scms,现在导 ... -
oracle错误ora-01658的解决办法(转)
2011-11-19 15:52 926oracle错误ora-01658的解决办法 此错 ... -
ORACLE 字符串操作(转)
2011-08-09 21:17 857ORACLE 字符串操作 1 字符串连接 S ... -
Oracle学习之查询表的基本信息、主键、外键等(转)
2011-05-11 16:45 966<!--通过外键找表--> select * ... -
Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结(转)
2010-11-28 20:06 23701、使用超级用户登录sqlplus。2、创建表空间:SQL&g ...
相关推荐
Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载),这个命令很实用,对于分析人员经常用到。
SELECT col, AVG(value) OVER(PARTITION BY col ORDER BY col) FROM tmp1 ORDER BY col; 2、SUM ( [ DISTINCT | ALL ] expr ) OVER ( analytic_clause ) 例如: --聚合函数 SELECT col, sum(value) FROM tmp1 ...
ROW_NUMBER () OVER([partition_clause] order_by_clause) dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但其后的序列值从...
1、 结构:聚合函数()over( partition by 字段1,字段2,字段3 order by 字段 desc/asc range between 数值/date preceding/flowing and 数值/date preceding/flowing) 聚合函数可以是:sum,count,avg,max,min,...
第五篇 分析函数简述 分析函数的语法结构比较复杂,但多数函数都具有相同的语法结构,所以先在之前进行统一介绍,后续单个函数介绍时就不过多说明函数语法结构了。 基本上所有的分析函数均是这种格式: 函数...
sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和 sum(sal) over (partition by deptno) 按部门求总和 sum(sal) over (order by deptno,ename) 不按部门“连续”求总和 sum(sal) over () ...
rank ( ) over ([partition by col] order by col ) dense_rank ( ) over ([partition by col] order by col ) rownumber ( ) over ( [partition by col] order by col ) rank() 是排名的函数,该函数组内...
本文主要介绍Oracle中rank,over partition函数的用法,希望对大家有所帮助。
3、PERCENT_RANK() OVER([partition_clause] order_by_clause) 与CUME_DIST类似,本函数返回分组序列中各行在分组序列的相对位置。其返回值也是介于0到1之间,不过其起始值始终为0而终结值始终为1。 例如:SELECT ...
本文主要是对Oracle分析函数概念的简单介绍,同时讲解了Over函数的用法,希望对大家学习分析函数有所帮助。
这一篇是对前面所有关于分析函数的文章的总结: 一、统计方面: 代码如下:Sum() Over ([Partition by ] [Order by ]) Sum() Over ([Partition by ] [Order by ] Rows Between Preceding And Following) ...
介绍了 row_number() over(order by column asc) 函数和 row_number() over(partition by column1 order by column2 asc) 的使用实例和方法
在前面《Oracle开发之分析函数(Rank、Dense_rank、row_number)》一文中,我们已经知道了如何为一批记录进行全排列、分组排列。假如被排列的数据中含有空值呢? 代码如下:SQL> select region_id, customer_id, ...
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的...
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的...
在oracle中,有rank,dense_rank,row_number,以及分组排名partition。 说明: rank:排名会出现并列第n名,它...row_number() over(partition by bb.channel_name order by sum(aa.dk_serv_num) desc nulls last) p1_ra
有些事情始终是需要坚持下去的。...row_number() OVER(ORDER BY ID)-row_number() OVER(PARTITION BY val ORDER BY ID) x FROM LCY ) GROUP BY val,x ORDER BY MIN(ID); 第二种rank(): SELECT val,COUNT(*
select * from (select deptno,ename,sal,dense_rank() over(partition by deptno order by sal desc) a from scott.emp) where a<=3 order by deptno asc,sal desc ; 结果: –rank()分析函数(运行结果与上语句...