`
Seabiscuit_1992
  • 浏览: 8319 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

首页 > 编程 > PL/SQL语法之OVER(PARTITION BY)及开窗函数 PL/SQL语法之OVER(PARTITION BY)及开窗函数

阅读更多

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

一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
对于每个组返回多行,而聚合函数对于每个组只返回一行。
下面通过几个例子来说明其应用。
1:统计某商店的营业额。
date sale
1 20
2 15
3 14
4 18
5 30
规则:按天统计:每天都统计前面几天的总额
select t.* ,sum(sale) over(order by date) sum from example t
得到的结果:
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
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列值
—将B栏位值相同的对应的C 栏位值加总,数据:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6
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,这样就会将C的栏位值sum放在每行后面,也可以直接空着,不需要填写,如over()
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
求个人工资占部门工资的百分比
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
二:开窗函数
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
over(partition by deptno)按照部门分区
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 ;
over(order by salary rows between 2 preceding and 4 following)
每行对应的数据窗口是之前2行,之后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 COLUMN ORDER BY COLUMN)
简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。
示例:
xlh row_num
1700 1
1500 2
1085 3
710 4
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
实例:
create table employee (empid int ,deptid int ,salary decimal(10,2))
insert into employee values(1,10,5500.00)
insert into employee values(2,10,4500.00)
insert into employee values(3,20,1900.00)
insert into employee values(4,20,4800.00)
insert into employee values(5,40,6500.00)
insert into employee values(6,40,14500.00)
insert into employee values(7,40,44500.00)
insert into employee values(8,50,6500.00)
insert into employee values(9,50,7500.00)
数据显示为
empid deptid salary
———– ———– ——————-
1 10 5500.00
2 10 4500.00
3 20 1900.00
4 20 4800.00
5 40 6500.00
6 40 14500.00
7 40 44500.00
8 50 6500.00
9 50 7500.00
需求:根据部门分组,显示每个部门的工资等级
预期结果:
empid deptid salary rank
———– ———– ————— ———-
1 10 5500.00 1
2 10 4500.00 2
4 20 4800.00 1
3 20 1900.00 2
7 40 44500.00 1
6 40 14500.00 2
5 40 6500.00 3
9 50 7500.00 1
8 50 6500.00 2

SQL脚本:
SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

分享到:
评论

相关推荐

    Oracle 10g中的高级SQL函数

    常见的分析函数有 `OVER()`, `PARTITION BY`, `ORDER BY`。 五、正则表达式 Oracle 10g支持正则表达式,通过 `REGEXP_LIKE()`, `REGEXP_SUBSTR()`, `REGEXP_REPLACE()` 等函数,可以进行复杂的数据匹配、提取和替换...

    oracle数据库期末考试题和答案.doc

    Oracle数据库期末考试试题涉及到多个方面的Oracle知识,包括内存区、数据字典、表空间、数据库服务、SQL语法、锁机制、并发控制、分区、索引、视图、游标、异常处理、PL/SQL块以及数据库管理工具。下面对这些知识点...

    SQL Server与Oracle常用函数对比

    - SQL Server的`OVER()`和`PARTITION BY`用于窗口函数,Oracle也支持类似的功能。 - `RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()`在两个系统中都能找到。 9. **集合函数**: - SQL Server的`UNION`, `INTERSECT...

    oracle 分析函数总结

    分析函数是在Oracle 8.1.6版本引入的,目的是为了提高性能并解决无法通过传统SQL或PL/SQL简单实现的复杂计算问题。如今,这些功能已成为SQL标准的一部分。 分析函数的核心概念是“比照窗口”(window),这是指基于...

    SQL Server和Oracle的常用函数对比.rar

    - `ORDER BY`在两个系统中用于排序,但SQL Server的`OVER()`子句提供了更复杂窗口函数功能,Oracle则通过`PARTITION BY`实现类似功能。 7. **条件判断函数**: - `IF...ELSE`结构在SQL Server中进行条件判断,...

    key_functions_in_oracle_sql.rar_in

    例如,`RANK()`, `ROW_NUMBER()`, `LEAD()`, `LAG()`, `OVER()`, 和 `PARTITION BY` 都是窗口函数的实例,它们能提供在数据集中的上下文信息。 10. **DML语句**: INSERT、UPDATE和DELETE分别用于插入新数据、修改...

    oracle分析函数

    分析函数的基本语法结构是`FUNCTION_NAME(PARTITION BY, ORDER BY, [ROWS/RANGE BETWEEN ...])`,其中PARTITION BY用于划分数据,ORDER BY定义排序,ROWS/RANGE BETWEEN定义窗口范围。 8. **PLSQL开发笔记**: 在...

    Oracle10gR2分析函数.pdf

    #### 三、常见分析函数及用法 1. **累计函数** - **SUM()**:计算累积总和。 - **COUNT()**:计算累积计数。 - **MIN()** 和 **MAX()**:计算最小值和最大值。 2. **移动平均函数** - **AVG()**:计算在指定...

    ORACLE分析函数详解

    分析函数的语法结构包括一个聚合函数,如SUM, AVG等,加上OVER()子句,其中可以定义PARTITION BY和ORDER BY子句来指定计算的分组和顺序。这些功能大大增强了SQL的表达能力,使得处理复杂的数据分析问题变得更加便捷...

    Oracle专题培训.doc

    Oracle专题培训涵盖了数据库系统中的多个重要知识点,主要讨论了并行执行、分析函数、直接路径插入、物化视图、聚合函数扩展、DBMS_SQL、DBMS_SCHEDULER、层次查询和自治事务。以下是对这些主题的详细阐述: 一、...

    oracle数据库期末考试题及答案.doc

    Oracle数据库期末考试试题涉及到多个方面的知识点,以下是这些题目...以上内容涵盖了Oracle数据库管理、SQL语法、并发控制、表和索引管理、视图创建以及异常处理等多个核心概念,是学习和理解Oracle数据库系统的基础。

    超详细Oracle教程.pdf

    - **分区函数**:讲解如何使用PARTITION BY子句对数据进行分区处理。 #### 第九章 数据字典 - **系统视图**:介绍Oracle提供的系统视图,如V$SESSION、V$TABLESPACE等,用于监控数据库的状态。 - **用户视图**:...

    oracle日积月累

    例如,`analytic_function: RANK() OVER (PARTITION BY column ORDER BY another_column)`将根据指定列排序并为每个分区分配一个唯一的排名。 2. **Oracle函数大全**: Oracle提供了一系列内置函数,如字符串函数...

    oracle数据库期末考试试题与答案.doc

    Oracle数据库期末考试试题涉及到多个方面的知识点,包括数据库内存结构、数据存储、用户管理、网络连接、SQL语法、索引类型、异常处理、游标操作、存储过程与包、触发器、备份与恢复策略以及数据导出导入等。...

    oracle常用的数据库脚本

    在Oracle数据库管理中,脚本是执行特定任务的SQL或PL/SQL集合,它们极大地提高了DBA(数据库管理员)和开发人员的工作效率。本话题主要围绕"oracle常用的数据库脚本"展开,特别是针对如何处理重复数据的问题。我们将...

    oracle基础练习.docx

    分析函数如RANK() OVER(PARTITION BY ... ORDER BY ...)可以实现分组内的排名。此外,Oracle还支持复杂的查询逻辑和约束,如CHECK约束,可以用来确保数据的完整性。 总的来说,Oracle数据库提供了强大而灵活的...

    超详细ORACLE培训带实例带书签目录

    - **分区函数**:PARTITION BY子句的使用。 #### 第九章 数据字典 - **数据字典概述**:Oracle数据库中存储有关数据库元数据的信息。 - **常用数据字典视图**:如DBA_TABLES、DBA_COLUMNS等。 - **数据字典的使用...

    oracle chm帮助文件下载

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的功能和语法,包括高级查询、事务处理、存储过程、数据类型转换以及数据库管理。以下是一些Oracle数据库中的关键知识点,这些知识点涵盖了从基本操作...

    oracle分页查询

    为了解决这个问题,可以使用`ROW_NUMBER()`函数配合`PARTITION BY`和`ORDER BY`子句,这是Oracle 12c引入的`FETCH NEXT ... ROWS ONLY`语法,使得分页更加灵活和高效: ```sql SELECT * FROM ( SELECT a.*, ROW_...

Global site tag (gtag.js) - Google Analytics