百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle分析函数还是要知道滴(oracle数据分析函数)

mhr18 2024-09-26 14:24 21 浏览 0 评论

本文转自「开发者圆桌」一个10年老猿原创文章传播开发经验,尤其适合初学者或刚入职场前几年程序猿的微信公众号。

数据库中的函数封装了一些通用的功能,例如日期类型和字符串类型之间的转换,每个数据库系统都内置了一些函数,当然用户也可以自定义函数。

在Oracle数据库中,函数可总分为单行函数、分组函数「亦称聚合函数」、分析函数三类。

单行函数

单行函数分为五种类型:字符函数、数值函数、日期函数、转换函数、通用函数。比如:

--大小写控制函数

select lower('Hello World') 转小写, upper('Hello World') 转大写 from dual;

--initcap: 首字母大写

select initcap('hello world') 首字符大写 from dual;

--字符控制函数

-- concat: 字符连接函数, 等同于 ||

select concat('Hello',' World') from dual;

分组函数

分组函数「亦称聚合函数」能在select或select的having子句中使用,当用于select子串时常常都和GROUP BY一起使用。多行函数分为接收多个输入,返回一个输出。比如:

--分组数据:求各个部门的平均工资

select deptno,avg(sal) from emp group by deptno;

--group by作用于多列: 按部门,不同的工种,统计平均工资

--group by作用于多列:先按照第一列分组;如果相同,再按照第二列分组

select deptno,job,avg(sal) from emp group by deptno,job;

--:求部门的平均工资大于2000的部门

select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

分析函数

分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值,为我们分析数据提供了一种简单高效的处理方式。

在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现在只要一条简单的SQL语句就可以实现了,而且在执行效率方面也有相当大的提高。

分析函数和分组函数的不同

普通的分组函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值。

分析函数的形式

常用的分析函数如下所列:

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

分析函数常见应用场景

一般可以解决这样的问题:

①查找上一年度各个销售区域排名前10的员工

②按区域查找上一年度订单总额占区域订单总额20%以上的客户

③查找上一年度销售最差的部门所在的区域

④查找上一年度销售最好和最差的产品

我们看看上面的几个问题就可以感觉到这几个查询和我们日常遇到的查询有些不同,具体有:

①需要对同样的数据进行不同级别的聚合操作

②需要在表内将多条数据和同一条数据进行多次的比较

③需要在排序完的结果集上进行额外的过滤操作

分析函数初体验

简单介绍几个分析函数的使用样例,让大家能够近距离体验一下Oracle分析函数的强大,Oracle的资料还是比较好找的「相对于DB2来说」,搜索「Oracle分析函数」关键字即可获取更多相关用法,这些样例均在scott用户下成功运行。

例1,显示各部门员工的工资,并附带显示该部门的最高工资

执行SQL

select e.deptno,

e.empno,

e.ename,

e.sal,

last_value(e.sal)

over(partition by e.deptno

order by e.sal rows

--unbounded preceding and unbouned following针对当前所有记录的前一条、后一条记录,也就是表中的所有记录

--unbounded:不受控制的,无限的

--preceding:在...之前

--following:在...之后

between unbounded preceding and unbounded following) max_sal

from emp e;

运行结果

例2,按照deptno分组,然后计算每组值的总和

执行SQL

select empno,

ename,

deptno,

sal,

sum(sal) over(partition by deptno order by ename) max_sal

from emp;

运行结果

例3,当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总

执行SQL

select empno,

ename,

deptno,

sal,

--注意rows between 1 preceding and 1 following 是指当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总

sum(sal) over(partition by deptno

order by ename

rows between 1 preceding and 2 following) max_sal

from emp;

运行结果

例4,终极测试

执行SQL

select

deptno 部门编号,ename 员工姓名,sal 薪水,

avg(sal) over(partition by deptno) 该部门薪水均值,

sum(sal) over(partition by deptno) 该部门薪水总额,

count(sal) over(partition by deptno) 部门员工数量,

dense_rank() over(partition by deptno order by sal desc) 该人员的部门薪水排行1,

row_number() over(partition by deptno order by sal desc) 该人员的部门薪水排行2,

dense_rank() over(order by sal desc) 该人员的全公司薪水排行,

min(sal) over(partition by deptno) 该部门的最低薪水1 ,

min(sal) keep(dense_rank first order by sal) over(partition by deptno) 该部门的最低薪水2 ,

first_value(sal) over(partition by deptno order by sal) 该部门的最低薪水3,

max(sal) over(partition by deptno) 该部门的最高薪水1,

max(sal) keep(dense_rank last order by sal) over(partition by deptno) 该部门的最高薪水2,

last_value(sal) over(partition by deptno order by sal) 该部门的最高薪水3,

last_value(sal) over(partition by deptno order by sal rows between unbounded preceding and unbounded following ) 该部门的最高薪水4,

lag(ename, 1, '00') over(order by sal desc) 薪水在自己前一位的人,

lead(ename, 1, '00') over(order by sal desc) 薪水在自己后一位的人

from emp e

order by deptno,sal,ename

运行结果

注意:

「该部门的最高薪水1\2\3」等结果是一样的,只是使用了不同的写法而已。

last_value()的不同写法导致「该部门的最高薪水3」和「该部门的最高薪水4」结果是不同的,可以这样去理解:last_value()默认统计范围是 rows between unbounded preceding and current row,因此需要加上rows between unbounded preceding and unbounded following ,才能得到正确的统计结果,「该部门的最高薪水4」的统计结果才是正确的。

相关推荐

甲骨文签署多项大型云协议,其一未来可贡献超300亿美元年收入

IT之家7月1日消息,根据甲骨文Oracle当地时间6月30日向美国证券交易委员会(SEC)递交的FORM8-K文件,该企业在始于2025年6月1日的202...

甲骨文获TEMU巨额合同,后者大部分基础设施将迁移至Oracle云

IT之家6月23日消息,Oracle甲骨文创始人、董事长兼首席技术官LarryEllison(拉里埃里森)在本月早些时候的2025财年第四财季和全财年财报电话会议上表示,Oracle...

Spring Boot 自定义数据源设置,这些坑你踩过吗?

你在使用SpringBoot进行后端开发的过程中,是不是也遇到过这样的问题:项目上线后,数据库连接总是不稳定,偶尔还会出现数据读取缓慢的情况,严重影响了用户体验。经过排查,发现很大一部分原因竟然...

一个开箱即用的代码生成器(一个开箱即用的代码生成器是什么)

今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...

低代码建模平台-数据挖掘平台(低代码平台的实现方式)

现在来看一下数据连接。·这里是管理数据连接的空间,点击这里可以新增一个数据连接。·输入连接名称,然后输入url,是通过gdbc的方式去连接的数据库,目前是支持mysql、oracle以及国产数据库达梦...

navicat 17.2.7连接oracle数据库提示加载oracle库失败

系统:macOS15.5navicat版本:navicatpremiumlite17.2.7连接oracle测试报错:加载oracle库失败【解决办法】:放达里面找到程序,显示简介里面勾选“使...

开源“Windows”ReactOS更新:支持全屏应用

IT之家6月17日消息,ReactOS团队昨日(6月16日)在X平台发布系列推文,公布了该系统的最新进展,包括升级Explorer组件,支持全屏应用,从Wine项目引入了...

SSL 推出采用全模拟内置混音技术的模拟调音台Oracle

英国调音台传奇品牌SolidStateLogic宣布推出Oracle——一款采用全模拟内置混音技术的调音台,在紧凑的AWS尺寸机箱内集成了大型调音台的功能。该调音台提供24输入和...

47道网络工程师常见面试题,看看有没有你不会的!

你们好,我的网工朋友。网络工程师面试的时候,都会被问到什么?这个问题其实很泛,一般来说,你肯定要先看明白岗位需求写的是什么。基本上都是围绕公司需要的业务去问的。但不可否认的是,那些最基础的概念,多少也...

汉得信息:发布EBS系统安装启用JWS的高效解决方案

e公司讯,从汉得信息获悉,近日,微软官方宣布InternetExplorer桌面应用程序将于2022年6月15日正式停用。目前大部分客户都是使用IE浏览器打开EBS的Form界面,IE停用后,只能使...

36.9K star ! 推荐一个酷炫低代码开发平台!功能太强!

前言最近在逛github,看看能不能搜罗到一些对自己有帮助的开源软件。不经意间看到一个高star的java开源项目:jeecg-boot。进入在线演示版一看,感叹实在是太牛了!此开源项目不管是给来学习...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

手把手教你在嵌入式设备中使用SQLite3

摘要:数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table),在嵌入式linux中有时候它也需要用到数据库,听起来好难,其实就是几个函数...

JAVA语言基础(java语言基础知识)

一、计算机的基本概念什么是计算机?计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行、自动高速处理海量数据的现代化智能电子设备。由硬件和软件组成、没有安装过任何软件的计算机称...

再见 Navicat!一款开源的 Web 数据库管理工具!

大家好,我是Java陈序员。在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件,基...

取消回复欢迎 发表评论: