测试表结构:
SQL> desc can_do;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(9)
NAME VARCHAR2(20)
DEPART VARCHAR2(50)
AGE NUMBER(3)
SALARY NUMBER(7)
测试表数据:
ID NAME DEPART AGE SALARY 1 zhanga mochasoft 28 3000 2 zhangb mochasoft 27 3500 3 zhangc mochasoft 29 4000 15 zhaoe hp 25 6000 4 wanga microsoft 26 8000 14 zhaod hp 26 8050 13 zhaoc hp 26 8090 8 liub ibm 26 8800 5 wangb microsoft 30 9000 12 zhaob hp 27 9050 7 liua ibm 24 9900 6 wangc microsoft 25 10000 11 zhaoa hp 28 11150 9 liuc ibm 27 12000 10 liud ibm 28 13000
1、over的用法:
<1>、over(order by c.salary range between 3000 preceding and 150 following) :
select avg(c.salary) over(order by c.salary range between 3000 preceding and 150 following) as result,
c.salary
from can_do c
select(8000+6000+8050+8090)/4 from dual;
RESULT SALARY 3000 3000 3250 3500 3500 4000 4125 6000 7535 8000 7535 8050 7535 8090 7788 8800 8141.428571 9000 8498.333333 9050 8861.25 9900 8861.25 10000 9650 11150 10183.33333 12000 11537.5 13000
<2>、over(order by c.salary rows between 1 preceding and 2 following)
select avg(c.salary) over(order by c.salary rows between 1 preceding and 2 following) as result,
c.salary
from can_do c
select (8050+8000+8090)/3 from dual;
<3>、over(order by c.salary rows between unbounded preceding and unbounded following)
select avg(c.salary) over(order by c.salary rows between unbounded preceding and unbounded following) as result,
c.salary
from can_do c
<4>、over(order by c.salary range between unbounded preceding and unbounded following)
select avg(c.salary) over(order by c.salary range between unbounded preceding and unbounded following) as result,
c.salary
from can_do c
说明:<3>和<4>即计算所有行,相当于没有条件限制或者没有范围的约束。
<5>、over(partition by c.depart) :分区域统计(平均数)
select avg(c.salary) over(partition by c.depart) as result,c.salary,c.depart from can_do c
如下:
select distinct avg(c.salary) over(partition by c.depart) as result,c.depart from can_do c
<6>、连续求和问题,sum():如下:
select sum(d.salary) over (order by rownum) as result,d.salary,d.name from can_do d
select sum(d.salary) over (partition by d.depart) as result,d.salary,d.depart from can_do d
select sum(d.salary) over (partition by null) as result,d.salary,d.depart from can_do d
<7>、级别问题,rank()和dense_rank(),rank()会跳号,dense_rank()不会跳号:
select rank() over (partition by e.depart order by e.salary desc) as result,e.salary,e.name,e.depart from can_do e
select rank() over (order by f.salary desc) as result,f.salary,f.name from can_do f
select dense_rank() over (order by f.salary desc) as result,f.salary,f.name from can_do f
<8>、将分组最大值(最小值)统计出来:
select max(g.salary) over(partition by g.depart) as result,g.name,g.depart,g.salary from can_do g
select min(g.salary) over(partition by g.depart) as result,g.name,g.depart,g.salary from can_do g
select distinct min(g.salary) over(partition by g.depart) as result,g.depart from can_do g
select distinct max(g.salary) over(partition by g.depart) as result,g.depart from can_do g
Tip:如果没有指定over()函数部分,则会有如下提示:
SQL> select rank() ,e.salary,e.name,e.depart from can_do e;
select rank() ,e.salary,e.name,e.depart from can_do e
*
ERROR at line 1:
ORA-30484: missing window specification for this function
可以参见:xsb.itpub.net/post/419/33028
<9>、row_number()的用法:
select row_number() over(order by h.salary) as result,h.salary from can_do h
select row_number() over(order by h.salary desc) as result,h.salary from can_do h
select row_number() over(partition by h.depart order by h.salary) as result,h.depart,h.salary from can_do h
【编写于 2009-01-21】
分享到:
相关推荐
### Oracle分析函数详解 #### 一、Oracle分析函数概述 Oracle分析函数是在处理大量数据时极为有用的一套工具,主要用于在线分析处理(OLAP)场景。这类函数可以在多个级别上进行数据聚合,并支持复杂的排序、分组...
Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...
其中,Oracle的分析函数是其强大的特性之一,它允许用户在单个SQL查询中执行复杂的分析操作,而无需使用子查询或者自连接。这篇文档将深入探讨Oracle中的分析函数,帮助你更好地理解和利用这一功能。 一、什么是...
### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且结果可以根据特定条件进行动态调整。这种灵活性使得Oracle分析函数在处理复杂的数据集时非常...
Oracle分析函数是数据库管理系统Oracle中的一个强大特性,它允许用户在SQL查询中执行复杂的分析操作。分析函数在处理报表和数据迁移任务时尤其有用,因为它们可以基于分组计算聚合值,并为每个分组返回多行,而不...
Oracle 分析函数是一种强大的SQL工具,它允许你在处理数据时执行复杂的分析操作,而不像聚合函数那样仅仅返回单行结果。分析函数在Oracle 8.1.6版本中被引入,自那时起,它们已经成为数据库查询和报表生成的重要组成...
oracle 分析函数 开发必备 数据库开发工程师
在描述中提到的场景中,有几种不同的方法可以实现数据统计,包括通过程序处理、使用临时表和包、标准SQL的UNION以及Oracle特有的分析函数。每种方法都有其优缺点。例如,程序处理方法与数据库无关,但增加了开发工作...
Oracle 分析函数详解 Oracle 分析函数是 Oracle 数据库中的一种强大功能,能够帮助用户快速进行数据分析和处理。在本文中,我们将对 Oracle 分析函数进行详细的介绍,并对其各个函数进行解释。 一、总体介绍 ...
### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它自Oracle 8.1.6版本开始引入,并在后续版本中不断完善和发展。...理解并熟练掌握这些函数的使用方法,将有助于更高效地完成数据处理任务。
Oracle分析函数是数据库管理系统Oracle中的一种高级特性,用于处理和分析数据集,提供了一种高效的方式来执行聚合操作,而无需多次查询数据库。分析函数能够直接在单次查询中完成复杂的数据计算,包括排序、分组、...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它允许用户在单个查询中对一组行进行计算,而无需使用子查询或自连接。这些函数极大地增强了数据分析和报告的能力,提高了查询性能。以下是对Oracle分析...
Oracle分析函数使用总结Oracle分析函数使用总结Oracle分析函数使用总结Oracle分析函数使用总结
Oracle分析函数是数据库管理系统Oracle中一组强大的工具,用于处理集合数据,特别是在复杂的报表和数据分析场景中。它们允许用户在单个SQL查询中执行聚合操作,同时保持行的原始顺序,这是传统的GROUP BY函数无法...
在本文档中,我们将详细介绍 ORACLE 分析函数的使用和优化方法,并提供一些实用的示例代码和优化方案。同时,我们还将分析分析函数的优缺点,并讨论如何根据实际情况选择合适的分析函数。 1. 分析函数的优点 使用...
在Oracle 8i版本之后引入,分析函数为处理大量数据提供了高效的方法,避免了过去需要自连接、子查询或存储过程的复杂性。 1. **自动汇总函数:ROLLUP 和 CUBE** - **ROLLUP** 函数用于生成层次化的汇总数据。它会...
Oracle分析函数是数据库管理系统Oracle中的一个重要特性,自8.1.6版本开始引入,它们用于执行基于组的聚合计算,并且为每个组返回多行结果,而不仅仅是单行。这使得分析函数在数据分析和报表生成方面非常有用,能够...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...
### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且能够返回多个结果行。这与传统的聚合函数(如`SUM`、`COUNT`等)形成鲜明对比,后者通常只针对...