数据库-分析函数

Oracle数据库分析函数的详细分类说明及实例演示 示例1:显示部门最高工资(需注意窗口范围)二、分析函数详细分类及实例。结果:所有部门10员工显示。示例2:合并部门员工姓名。一、分析函数核心概念。 阅读详情

分析函数
基本语法
函数名称([参数]) VOER (
PARTITION BY 子句 字段,....
[ORDER BY 子句 字段,..[ASC][DESC][NULLS FIRST][NULLS LAST]]
[WINDOWING 子句]);
使用PARTITION BY子句

SELECT deptno,ename,sal,job,
SUM(sal) OVER(PARTITION BY deptno) sum部门工资总和
FROM emp;


如果不加PARTITION BY

SELECT deptno,ename,sal,job,
SUM(sal) OVER() sum全公司工资总和
FROM emp;


使用PARTITION BY子句加多个分区

SELECT deptno,ename,sal,job,
SUM(sal) OVER(PARTITION BY deptno,job)sum
FROM emp;

ORDER BY 子句
查看ORDER BY子句

SELECT deptno,ename,sal,hiredate,
RANK()OVER (PARTITION BY deptno ORDER BY sal,hiredate DESC) rk
FROM emp;


直接用ORDER BY排序

SELECT deptno,ename,sal,hiredate,
SUM(sal) OVER(ORDER BY ename)sum
FROM emp;


NULLS FIRST 出现NULL值的数据放在前面
NULLS LAST 出现NULL值的数据放在后面

SELECT deptno,ename,sal,comm,
RANK() OVER(ORDER BY comm DESC NULLS LAST) RK,
SUM(sal) OVER(ORDER BY comm DESC NULLS LAST) sum
FROM emp;

WINDOWING子句
RNGGE子句
在sal上设置偏移量

SELECT deptno,ename,sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal RANGE 300 PRECEDING) sum
FROM emp;


向上N匹配
下面是向下N匹配

SELECT deptno,ename,sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal RANGE 
BETWEEN 0 PRECEDING AND 300 FOLLOWING) sum
FROM emp;


匹配当前行数据

SELECT deptno,ename,sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal RANGE 
BETWEEN 0 PRECEDING AND CURRENT ROW) sum
FROM emp;


此处用了CURRENT ROW选项,表示比当前行数相同,所以只有相同的数据才会使用SUM计算总和
使用UNBOUNDED不设置边界

SELECT deptno,ename,sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal RANGE 
BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sum
FROM emp;

ROWS子句
设置两行偏移

SELECT deptno,ename,sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal ROWS 2 PRECEDING) sum
FROM emp;


查询行的范围

SELECT deptno,ename,sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) sum
FROM emp;


分析函数的范例
数据统计函数
SUM
MIN
MAX
AVG
COUNT
这些是数据统计函数
查询编号是7369的员工姓名,职位,基本工资,部门编号,部门人数,平均工资,最高工资,最低工资,总工资

 

SELECT * FROM(
SELECT empno,ename,job,sal,deptno,
COUNT(empno) OVER(PARTITION BY deptno) count,
ROUND(AVG(sal) OVER(PARTITION BY deptno),2) avg,
MAX(sal) OVER(PARTITION BY deptno) max,
MIN(sal) OVER(PARTITION BY deptno) min,
SUM(sal) OVER(PARTITION BY deptno) sum
FROM emp
) temp
WHERE temp.empno=7369;

 


查询每个员工的编号,姓名,基本工资,所在部门名称,部门位置,以及此部门的平均工资,最高和最低工资
emp和dept表

 

SELECT e.empno,e.ename,e.sal,d.dname,d.loc,
ROUND(AVG(sal) OVER (PARTITION BY e.deptno ORDER BY sal RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),2) avg, 
MAX(sal) OVER(PARTITION BY e.deptno ORDER BY sal RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) max,
MIN(sal) OVER(PARTITION BY e.deptno ORDER BY sal RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) min,
SUM(sal) OVER(PARTITION BY e.deptno ORDER BY sal RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) sum
FROM emp e,dept d
WHERE e.deptno=d.deptno;

 

等级函数
记录标记函数
RANK()和DENSE_RANK()
观察RANK()和DENSE_RANK()函数

SELECT deptno,ename,sal,
RANK() OVER(PARTITION BY deptno ORDER BY sal) rank_result,
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) dense_rank_resut
FROM emp;


可以看出RANK是有重复是当前值未变,但其它已经+1会跳号,下个不同的就+2了和DENSE_RANK()每次只+1,重复也不会增加
行标记函数
ROW_NUMBER()自动成功行记录号,并且不管内容是否重复都可以连接编号

SELECT deptno,ename,sal,
ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal) row_result_deptno,
ROW_NUMBER() OVER(ORDER BY sal) row_result_sal
FROM emp;
使用KEEP语句保留

满足条件的数据

SELECT deptno,
MAX(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) max_sal,
MIN(sal) KEEP (DENSE_RANK LAST ORDER BY sal) min_sal
FROM emp
GROUP BY deptno;


取出首行和尾行的记录

 

FIRST_VALUE() LAST_VALUE()
SELECT deptno,empno,ename,sal,
FIRST_VALUE(sal) OVER(PARTITION BY deptno ORDER BY sal
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_result,
LAST_VALUE(sal) OVER (PARTITION BY deptno ORDER BY sal
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) last_result

FROM emp
WHERE deptno=10;

 

比较相邻记录
LAG()取得之前所列数据行的第N行记录显示,如果没有则使用默认值,不设置默认值返回NULL
LEAD()取重之后所列数据的第N行记录显示,如果没有则使用默认值,不设置默认值返回NULL

SELECT deptno,empno,ename,sal,
LAG(sal,2,0) OVER (PARTITION BY deptno ORDER BY sal) lag_result,
LEAD(sal,2,0) OVER (PARTITION BY deptno ORDER BY sal)lead_result
FROM emp
WHERE deptno=20;

报表函数
CUME_DIST()计算在分区中的相对位置
NTILE(数字)将一个分区分为“表达式”的散列表示
RATIO_TO_TEPORT(表达式)该函数计算expression/(sum(expression))的值,它给出的相对于总数据的百分比
验证CUME_DIST()函数
假设分区有5行测0.2,0.4,0.6,0.8,1.0进行划分

SELECT deptno,ename,sal, 
CUME_DIST() OVER(PARTITION BY deptno ORDER BY sal) cume
FROM emp
WHERE deptno IN(10,20);

 

NTILE函数
对一个数据区有序结果进行划分,并为每个小组分配唯一的组编号

SELECT deptno,sal,
SUM(sal) OVER (PARTITION BY deptno ORDER BY sal) sum,
NTILE(3) OVER (PARTITION BY deptno ORDER BY sal) ntile_a,
NTILE(6) OVER (PARTITION BY deptno ORDER BY sal) ntile_b
FROM emp;

RATIO_TO_REPORT函数可以将需要统计的数据按照整体数据的百分比进行显示

SELECT deptno,SUM(sal),
ROUND(RATIO_TO_REPORT(SUM(sal)) OVER(),5) rate,
ROUND(RATIO_TO_REPORT(SUM(sal)) OVER(),5)*100 || '%'precent
FROM emp
GROUP BY deptno;


行列转换

查询每个部门中各个职位的总工资

SELECT deptno,job,SUM(sal)
FROM emp
GROUP BY deptno,job;


第2种实现
用DECODE显示

 

SELECT deptno, 
SUM(DECODE(job,'PRESIDENT',sal,0)) PRESIDENT_JOB,
SUM(DECODE(job,'MANAGER',sal,0)) MANAGER_JOB,
SUM(DECODE(job,'ANALYST',sal,0)) ANALYST_JOB, 
SUM(DECODE(job,'CLERK',sal,0)) CLERK_JOB, 
SUM(DECODE(job,'SALESMAN',sal,0)) SALESMAN_JOB
FROM emp
GROUP BY deptno;

 


不使用DECODE来实现

 

SELECT temp.dno,SUM(PRESIDENT_JOB),SUM(MANAGER_JOB),SUM(ANALYST_JOB),SUM(CLERK_JOB),SUM(SALESMANJOB)
FROM(
SELECT deptno dno, 
(SELECT SUM(sal) FROM emp WHERE job='PRESIDENT'AND empno=e.empno) PRESIDENT_JOB,
(SELECT SUM(sal) FROM emp WHERE job='MANAGER'AND empno=e.empno) MANAGER_JOB,
(SELECT SUM(sal) FROM emp WHERE job='ANALYST'AND empno=e.empno) ANALYST_JOB,
(SELECT SUM(sal) FROM emp WHERE job='CLERK'AND empno=e.empno) CLERK_JOB,
(SELECT SUM(sal) FROM emp WHERE job='SALESMAN'AND empno=e.empno) SALESMANJOB
FROM emp e) temp
GROUP BY temp.dno
ORDER BY temp.dno DESC;

 

PIVOT函数和UNPIVOT函数

 

SELECT * FROM (SELECT deptno,job,sal FROM emp)
PIVOT(
SUM(sal)
FOR job IN(
'PRESIDENT' AS PRESIDENT_JOB,
'MANAGER' AS MANAGER_JOB,
'ANALYST' AS ANALYST_JOB,
'CLERK' AS CLERK_JOB,
'SALESMAN' AS SALESMANJOB
)
)ORDER BY deptno;

 


使用XML与ANY
如果在PIVOT中增加了XML显示,可以利用ANY设置所要操作的所有数据

SELECT * FROM (SELECT deptno,job,sal FROM emp)
PIVOT XML(
SUM(sal)
FOR job IN(ANY)
)ORDER BY deptno;


查询更多统计信息

 

SELECT * FROM 
(
SELECT deptno,job,sal,
SUM(sal) OVER (PARTITION BY deptno) sumsal,
MAX(sal) OVER (PARTITION BY deptno) maxsal,
MIN(sal) OVER (PARTITION BY deptno) minsal
FROM emp
)
PIVOT(
SUM(sal)
FOR job IN(
'PRESIDENT' AS PRESIDENT_JOB,
'MANAGER' AS MANAGER_JOB,
'ANALYST' AS ANALYST_JOB,
'CLERK' AS CLERK_JOB,
'SALESMAN' AS SALESMANJOB
)
)ORDER BY deptno;

 

 

设置多个统计函数,查询每个部门不同职位的总工资,以及每个部门不同职位的最高工资

 

SELECT * FROM 
(
SELECT deptno,job,sal FROM emp
)
PIVOT(
SUM(sal) AS sum, MAX(sal) AS max
FOR job IN(
'PRESIDENT' AS PRESIDENT_JOB,
'MANAGER' AS MANAGER_JOB,
'ANALYST' AS ANALYST_JOB,
'CLERK' AS CLERK_JOB,
'SALESMAN' AS SALESMANJOB
)
)ORDER BY deptno;
使用UNPIVOT
WITH temp AS(
SELECT * FROM 
( SELECT deptno,job,sal FROM emp)
PIVOT(
SUM(sal) 
FOR job IN(
'PRESIDENT' AS PRESIDENT_JOB,
'MANAGER' AS MANAGER_JOB,
'ANALYST' AS ANALYST_JOB,
'CLERK' AS CLERK_JOB,
'SALESMAN' AS SALESMANJOB
)
)ORDER BY deptno)
SELECT * FROM temp
UNPIVOT INCLUDE NULLS(
sal_sum FOR job IN(
PRESIDENT_JOB AS 'PRESIDENT',
MANAGER_JOB AS 'MANAGER' ,
ANALYST_JOB AS 'ANALYST' ,
CLERK_JOB AS 'CLERK' ,
SALESMANJOB AS 'SALESMAN'
)
)ORDER BY deptno;

 

分析函数,数据库开发 高能sql写法,数据库开发中会用到,有一些参考实例 立即下载

相关推荐

如何利用CN3791实现太阳能电池板对锂电池的高效充电管理

本文详细介绍了如何利用CN3791芯片实现太阳能电池板对锂电池的高效充电管理。CN3791集成了MPPT(最大功率点跟踪)功能,能智能调节太阳能板的输出,确保在不同光照条件下获得最大功率。文章涵盖芯片工作原理、外围电路设计、充电全过程管理及实际应用经验,帮助开发者优化太阳能充电系统效率。

weixin_33709219的博客 499

SQL-分析函数

SQL-分析函数 数据库SQL分析函数/窗口函数专题,值得收藏!几乎涵盖所有数据库,例如:Oracle、Hive、MySQL8.0、MaxComputer等。企业面试中,更是钟情分析函数问题,笔试、面试到基本跑不了。 分析函数主要分为四类: 1.聚合分析函数 2.排名分析函数 3.数学分析函数 4.行比较分析函数 一.聚合分析函数 SUM :该函数计算组中表达式的累积和 COUNT :对一组内发生的事情进行累积计数 MIN :在一个组中

weixin_43376707的博客 404

TeraTerm 使用技巧

⏹TeraTerm 使用技巧

菜鸟记录 1万+

SQl分析函数应用

迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 一 分析函数定义 在数据库中,分析函数是指对一组行计算聚合值的函数。与对一组行返回单个聚合值的聚合函数不同,分析函数对一组输入行计算函数,从而对每一行返回一个值。 简化语法: analytic_...

shilei_0124的博客 311

winedt + miktex + SumatraPDF 搭建latex环境

整个环境包含三部分: - winedt: 前端编辑器 - miktex: 后端编译器 - SumatraPDF: 预览器顺序无关紧要, 不过如果先装miktex的话, 可能会被winedt在安装的时候自动找到路径从而不需要设置.1.安装miktex首先在latex-project官网, 打开”get”后, 有四种平台: Linux, Mac OS, Windows, Online. 我写论文

Iteration makes perfection. 6463

OpenCV实战:5分钟搞定图像拼接(附Python代码)

本文通过OpenCV实战教程,详细讲解如何使用Python在5分钟内完成图像拼接。重点介绍`findHomography`函数和单应性矩阵的应用,提供完整的代码示例和常见问题解决方案,帮助开发者快速掌握图像拼接技术。

weixin_26833503的博客 120

Over()分析函数

说明:通过RANK()、DENSE_RANK()、ROW_NUMBER()对记录进行全排列、分组排列取值,但有时候,会遇到空值的情况,空值会影响得到的结果的正确性NULLS FIRST/LAST 可以帮助我们在处理含有空值的排序排列中,将空值字段记录放到最前或最后显示,帮助我们得到期望的结果。

weixin_40191861的博客 1465

Mamba-YOLOv8深度解析:基于状态空间模型的下一代目标检测架构(含完整代码与实战部署)文末含资料链接!

通过本文的完整指南,您将掌握从理论创新到工程落地的全流程技术细节。立即动手实践,开启目标检测的新纪元!

FJN110的博客 519

mysql分析函数

排序类:row_number、rank、dense_rank等,percent_rank、cume_dist 等分布排序类 相对引用类:lag、lead、first_value、last_value、nth_value 等

michael_linux的博客,一个小小小学生。滴水穿石,步步为营,只为那刹那芳华。 5482

【Dumper-7】入门指南 - 带你领略不一样的UE世界

摘要: Dumper-7是一款用于分析UE4/UE5游戏的逆向工具,可自动生成游戏内部结构的C++ SDK。支持Visual Studio、CMake和Xmake三种构建方式,通过DLL注入目标游戏后,自动识别引擎结构并输出C++ SDK文件(默认保存在C:\Dumper-7目录)。该工具适用于游戏Mod开发、安全研究和机制分析,提供完整的类层次映射、属性/函数识别功能。使用时需注意x64平台配置,生成SDK后可集成到自定义DLL项目中,通过示例代码展示如何查找游戏对象、访问世界状态和调用引擎函数。

kinghzking的专栏 435

全志平台camera驱动开发(4)NVP6134芯片4路模拟视频BT656输入

前言 1. 调试平台: 全志V5/T7等有BT656或BT1120的并行接口,理论有DVP接口的一般都支持 2. NVP6134可使用多路视频同时输入 硬件连接 模拟camera1 模拟camera2 NVP6134 ------>NVCSI0 ...

jzwjzw19900922的博客 3532

HQL中常用的函数

本人最近写sql常用的一些函数(不全),后续会持续更新整理

DevilManDriver的博客 1364

【Scratch考级100图】图01-等级考试scratch绘 画正方形

一、案例介绍 小朋友们应该在数学课或者平时生活中有了解过正方形,正方形在我们生活中到处可见,那我们如果通过Scratch软件来绘制一个正方形呢,我们一起来学习一下吧,在舞台正中央绘制一个边长为200的正方形,要求: 1、围绕舞台中心绘制正多边形,均匀分布在四个象限中 2、正方形边长为200个单位,线条粗细、颜色自定 3、利用画笔绘制正方形,不能有多余的线条 二、案例演示 【Scratch案例演示】Scratch图1-画正方形 三、案例分析 当我们点击小绿旗启动程序后,舞台上会出现一个画

青少年编程学习指导 2670

DB 查询分析器 方便地创建DB2自定义函数

本文详细地介绍了“万能数据库查询分析器”,中文版本《DB 查询分析器》、英文版本《DB Query Analyzer》6.03 来方便地创建DB2函数。创建DB2存贮过程与此相同,大家可以参照以下步骤。另外,本示例还适用于SQL语句要以逗号来分隔的数据库系统(如ORACLE)。

《万能数据库查询分析器》创作人 6056

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

DB 查询分析器 轻松创建DB2定义他们自己的函数

DB查询分析器方便地创建DB2自己定义函数 马根峰 (广东联合电子服务股份有限公司,广州510300)摘要 本文具体地介绍了“万能数据库查询分析器”,中文版本号《DB查询分析器》、英文版本号《DB Query Analyzer》6.03来方便地创建DB2函数。创建DB2存贮过程与此同样,大家...

weixin_30247159的博客 95

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

oracal数据库-聚合函数和分析函数

聚合函数和分析函数

m0_62787977的博客 1586

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Vertica和ORACLE与梧桐云原生分析型数据库函数差异对比

随着国产化趋势越演越烈,某某局点需要一个能够快速处理大数据量的国产化数据仓库,能够代替现有的(Oracle 和 Vertica)数据库进而保证业务的持续稳定发展,要针对业务场景对函数进行验证使用。

easilyyy的博客 301

Oracle Database 21c 分析函数增强

本文介绍了 Oracle Database 21c 中分析函数的语法增强,包括 WINDOW 子句、GROUPS 子句以及 EXCLUDE 子句。

Tony.Dong的专栏 1301

Oracle数据库的分析函数

分析函数 over 连续的相加 求各部门的薪水总和和全部总和 select name, salary, emp sum(salary) over (order by emp) 连续求和 sum(salary) over () 总和 100*round(sal/sum(sal) over(), 5) 份额 from company; ...

weixin_30562507的博客 412

Greenplum数据库中常用的聚合函数及其对应的分析函数

一、SUM()函数及其对应的分析函数(SUM() OVER) SUM()函数是一种常用的聚合函数,用于计算某一列的总和。三、MAX()函数及其对应的分析函数(MAX() OVER) MAX()函数用于获取某一列的最大值,在Greenplum数据库中也可以使用MAX() OVER实现对某一列的滑动窗口最大值计算。二、AVG()函数及其对应的分析函数(AVG() OVER) AVG()函数用于计算某一列的平均值,在Greenplum数据库中也可以使用AVG() OVER实现对某一列的累计平均值计算。

weixin_72431427的博客 1340

openGauss / 磐维数据库分析函数实用示例

本文主要介绍了 openGauss / 磐维数据库中分析函数的使用,涵盖聚合函数、排名函数、窗口函数、文本聚合函数、行列转换等多种函数,希望能对大家有所帮助。

Gauss松鼠会 1248

python database 日期_Python SQLite3数据库日期与时间常见函数用法分析

本文实例讲述了Python SQLite3数据库日期与时间常见函数。分享给大家供大家参考,具体如下:import sqlite3#con = sqlite3.connect('example.db')con = sqlite3.connect(":memory:")c = con.cursor()# Create tablec.execute('''CREATE TABLE s...

weixin_39683858的博客 983

teradata数据库分析函数_美股史上最大软件公司IPO诞生,数据仓库市场未来充满想象 | 爱分析洞见...

指导|黄勇调研 | 李喆冯伟撰写| 冯伟“ 硅谷独角兽Snowflake上月创造美股史上规模最大软件公司IPO,市值一度突破700亿美元。数据仓库市场经历20余年发展变革后,在云原生浪潮下即将迎来大洗牌?回顾历史,我们试图找到一条推动数据仓库市场发展的内在逻辑。硅谷数据仓库厂商Snowflake于2020年9月17日正式登陆纽交所,上市首日市值一度突破700亿美元。市场对于Sno...

weixin_39672572的博客 491
上一篇: web项目中的相对路径与绝对路径(servlet-day3)
下一篇: Eclipse系列问题解决
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值