[转]Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数

oracle的分析函数over 及开窗函数

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

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

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

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

date       sale

1           20

2           15

3           14

4           18

5           30

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

select date, sale, sum(sale) over(order by date) sum from t1.

得到的结果:

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(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)

时间: 2024-09-30 18:36:14

[转]Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数的相关文章

【翻译自mos文章】在windows平台上怎么启用Oracle database 企业版的partition?

来源于: How to enable Partitioning in Oracle Database Enterprise Edition 11.2 on Windows (文档 ID 1188238.1) 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.1 and later Information in this document applies to any platform. 目标: 在Windows平台上怎么启用Or

oracle下的OVER(PARTITION BY)函数介绍

转自:http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html OVER(PARTITION BY)函数介绍 开窗函数               Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. 开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:1:over后的写法:      

oracle的分析函数over(Partition by...)

Sql代码 over(Partition by...) 一个超级牛皮的ORACLE特有函数. 最近工作中才接触到这个功能强大而灵活的函数. oracle的分析函数over 及开窗函数 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行. 下面通过几个例子来说明其应用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

oracle的分析函数over 及开窗函数

转:http://www.2cto.com/database/201310/249722.html 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行. 下面通过几个例子来说明其应用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

oracle分析函数技术详解(配上开窗函数over())

一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同之处是什么?普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值. 分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(or

SQL Server数据库partition by 与ROW_NUMBER()函数使用详解[转]

关于SQL的partition by 字段的一些用法心得 先看例子: if object_id('TESTDB') is not null drop table TESTDB create table TESTDB(A varchar(8), B varchar(8)) insert into TESTDB select 'A1', 'B1' union all select 'A1', 'B2' union all select 'A1', 'B3' union all select 'A2'

over(partition by)开窗函数的使用

开窗函数是分析函数中的一种,开窗函数与聚合函数的区别是:开窗函数是用于计算基于组的某种聚合值且每个的组的聚合计算结果可以有多行,而聚合函数每个组的聚合计算结果只有一个.使用开窗函数可以在没有group by语句的情况下计算聚合值并将结果作为一个新字段输出.开窗函数还可以和其他函数结合使用,如row_number().rank().dense_rank().min().max().sum().first_value() .last_value().avg()等等,聚合函数与开窗函数结合使用可以提供

oracle 语法

1.基本语法:SELECT *[列名 [[AS] 别名], 列名2...] FROM 表名 [[AS] 别名]; 2. 使用||做连接:Oracle中的字符串用单引号.   例:SELECT '姓名:'||ename||'月薪'||sal FROM emp; 3. 使用DISTINCT可以消除重复内容 4. WHERE子句:使用WHERE指定的条件对数据进行筛选,返回符合条件的记录(行).   SELECT *[|列名 [[AS] 别名], 列名2...]       FROM 表名 [[AS]

SQLServer、MySQL、Oracle语法差异小集锦

一.表操作语法差异 在建表的时候,只有自增的语法不同. 主键(PRIMARY KEY).外键(FOREIGN KEY).非空(NOT NULL).唯一(UNIQUE).默认值(DEFAULT)都相同,自增实现的方式不同. 下面给出3种数据库通用的建表与初始化测试语句: CREATE TABLE Country( Id int PRIMARY KEY, Name varchar(20) ); CREATE TABLE Person ( Id int PRIMARY KEY, CountryId i