Oracle 查询优化改写(第六章)

news2025/1/9 16:25:12

第六章 使用数字

1 常用聚集函数(空值处理)

 

 

2 生成累计和

--公司为了查看用人成本,需要对员工的工资进行累加,
--以便查看员工人数与工资支出之间的对应关系。
SELECT Empno,
       Ename,
       Sal,
       SUM(Sal) Over(ORDER BY Empno) AS 成本累加,
       (SELECT Listagg(Sal, '+') Within GROUP(ORDER BY Empno)
          FROM Emp b
         WHERE b.Empno <= a.Empno
           AND Deptno = 30) 计算公式
  FROM Emp a
 WHERE Deptno = 30
 ORDER BY Empno;

 

--分析函数、rows开窗、range开窗、标量方式的累加方法对比。
SELECT Empno,
       Sal,
       SUM(Sal) Over(ORDER BY Empno) AS 分析函数,
       SUM(Sal) Over(ORDER BY Empno Rows BETWEEN Unbounded Preceding AND CURRENT ROW) AS Row开窗,
       SUM(Sal) Over(ORDER BY Empno RANGE BETWEEN Unbounded Preceding AND CURRENT ROW) AS Range开窗,
       (select sum(sal) from emp b where b.empno<=a.empno and deptno=30) as 标量
  FROM Emp a
 WHERE Deptno = 30
 ORDER BY 1;

 

 

3 计算累计差

 

 

4 更改累计和的值

 --银行存取款问题 PY取款,PR存款
 create or replace View V(id,amt,trx)
 as
 select 1,500,'PR' from dual union all
 select 2,200,'PY' from dual union all
 select 3,300,'PR' from dual union all
 select 4,200,'PY' from dual union all
 select 5,400,'PR' from dual union all
 select 6,100,'PY' from dual ;
  SELECT * FROM v ; 
  SELECT Id,
         CASE WHEN Trx = 'PY' THEN '取款' ELSE '存款' END 存取类型,
         Amt 金额,
         SUM(case when Trx = 'PY' THEN -amt ELSE amt END) over(order by id) as 余额
    FROM v
   ORDER BY Id;

 

5 返回部门工作排名前三位的员工

--PARTITION BY 子句可以把主查询返回的数据分组进行分析。
--row_number,rank,dense_rank来分组partition by生成序号。
 SELECT Deptno,
       Empno,
       Sal,
       Row_Number() Over(PARTITION BY Deptno ORDER BY Sal DESC) AS Row_Number,
       Rank() Over(PARTITION BY Deptno ORDER BY Sal DESC) AS Rank,
       Dense_Rank() Over(PARTITION BY Deptno ORDER BY Sal DESC) AS Dense_Rank
  FROM Emp

--查询各部门工资前三名
SELECT *
  FROM (SELECT Deptno,
               Empno,
               Sal,
               Row_Number() Over(PARTITION BY Deptno ORDER BY Sal DESC) AS Row_Number
          FROM Emp)
 WHERE Row_Number <= 3

 6 计算出现次数最多的值

 

--查看部门中那个工紫等级的员工最多。
--1.计算不同工资出现的次数
--2.按次数排序生成序号
--3.根据序号过滤等到需要的结果
--4.利用partition by 子句分别查询各部门那个工作等级的员工最多
SELECT Deptno, Sal,次数排序
  FROM (SELECT Deptno,
               Sal,
               Dense_Rank() Over(PARTITION BY Deptno ORDER BY 出现次数 DESC) AS 次数排序
          FROM (SELECT Sal, Deptno, COUNT(*) AS 出现次数
                  FROM Emp
                 GROUP BY Deptno, Sal) x) y
 WHERE 次数排序 = 1;

7 返回最值所在行数据

--标量
SELECT Deptno,
       Empno,
       (SELECT MAX(b.Ename) FROM Emp b WHERE b.Sal = a.Max_Sal) as 工资最高的人,
       (SELECT MAX(b.Ename) FROM Emp b WHERE b.Sal = a.Min_Sal) as 工资最低的人,
       Ename,
       Sal
  FROM (SELECT Deptno,
               Empno,
               MAX(Sal) Over(PARTITION BY Deptno) AS Max_Sal,
               MIN(Sal) Over(PARTITION BY Deptno) AS Min_Sal,
               Ename,
               Sal
          FROM Emp 
         WHERE Deptno = 10) a
--分析函数
select deptno,
empno,
max(ename) keep(dense_rank first order by sal) over(partition by deptno) as 工资最低的人,
max(ename) keep(dense_rank last order by sal) over(partition by deptno)  as 工资最高的人,
ename,
sal
from emp
where deptno=10
order by 1,6 desc;

 

--first、last语句也可以放在group里与其他聚合函数一样使用
--但要去掉后面的over(partition by xxx)
select deptno,
min(sal),
max(ename) keep(dense_rank first order by sal) as 工资最低的人,
max(sal) as max_sal,
max(ename) keep(dense_rank last order by sal) as 工资最高的人
from emp
group by deptno

 

--当有相同数据时,min和max的区别
SELECT Deptno,
       Empno,
       Ename,
       Sal,
       To_Char(Wmsys.Wm_Concat(Ename) Keep(Dense_Rank LAST ORDER BY Sal)
               Over(PARTITION BY Deptno)) AS 工资最高的人群,
       MAX(Ename) Keep(Dense_Rank LAST ORDER BY Sal) Over(PARTITION BY Deptno) AS 工资最高的人max,
       MIN(Ename) Keep(Dense_Rank LAST ORDER BY Sal) Over(PARTITION BY Deptno) AS 工资最高的人min
  FROM Emp
 WHERE Deptno = 10
 ORDER BY 1, 4 DESC;

 

8 fisrt_value

看上去这个语句没有问题,但是若把desc和first_value修改为asc和last_value来看一下;

 

 

SELECT Deptno,
        Empno,
        first_Value(Ename) Over(PARTITION BY Deptno ORDER BY Sal desc,ename) AS 工资最高的人之一,
        first_Value(Ename) Over(PARTITION BY Deptno ORDER BY Sal desc,ename desc) AS 工资最高的人之一,
        Ename,
        Sal
   FROM Emp
  WHERE Deptno = 10
  ORDER BY 1, 6 DESC;

 

 

9 求总和的百分比

--1.分组汇总
--2.通过分析函数取总合计
--3.得到总合计后就可以计算比例
SELECT y.*,round((工资合计/总合计)*100,2) as 工资比例
  FROM (SELECT Deptno, 工资合计, SUM(工资合计) over() AS 总合计
          FROM (SELECT Deptno, SUM(Sal) 工资合计
                  FROM Emp
                 WHERE Deptno IS NOT NULL
                 GROUP BY Deptno) x) y
 ORDER BY 1;

SELECT Deptno, Round(Ratio_To_Report(工资合计) Over() * 100, 2) AS 工资比例
  FROM (SELECT Deptno, SUM(Sal) 工资合计
          FROM Emp
         WHERE Deptno IS NOT NULL
         GROUP BY Deptno)
 ORDER BY 1;
 
 SELECT Deptno,
        Empno,
        Ename,
        Sal,
        Round(Ratio_To_Report(Sal) Over(PARTITION BY Deptno) * 100, 2) as 工资占比
   FROM Emp
  ORDER BY 1, 2;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/690960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绿色能源外交:国际间合作促进可再生能源全球普及

随着全球气候变化的威胁日益凸显&#xff0c;减少碳排放和转向可持续能源已经成为国际社会的共同目标。在这个背景下&#xff0c;绿色能源外交应运而生。绿色能源外交是指国际间合作&#xff0c;通过技术转让、政策协调和资金支持等手段&#xff0c;推动可再生能源在全球范围内…

文字PDF转换为图片格式的PDF

在我们的日常工作和生活中&#xff0c;有时候我们需要对PDF文件进行一些特殊处理。有时候&#xff0c;我们希望将PDF的每一页提取出来作为图片&#xff0c;方便在其他场景中使用&#xff1b;而有时候&#xff0c;我们则需要将PDF内的内容转换为图片格式&#xff0c;以防止他人对…

docker 操作手册

名词解释 images&#xff1a;封装了应用程序的镜像 tag&#xff1a;镜像的标记&#xff0c;一个镜像可以创建多个标记 container&#xff1a;装载镜像并运行 常用命令 查看容器 docker ps -a //查看全部镜像 启动容器 docker start mysql //启动mysql容器 停止容器 doc…

Python篇——数据结构与算法(第七部分:树)

目录 1.树与二叉树 2.树的实例&#xff1a;模拟文件系统 3.二叉树 4.二叉树的遍历 5.二叉搜索树 5.1插入 5.2查询 5.3删除 1.树与二叉树 2.树的实例&#xff1a;模拟文件系统 # 树的实例 class Node:def __init__(self, name, typedir):self.name nameself.type typ…

springboot集成mybatisPlus

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-jav…

Mysql快速生成Java实体类

需求缘由 在使用MybatisPlus过程中&#xff0c;就肯定会创建实体类&#xff0c;虽然 MybatisPlus 也为我们提供了代码生成器&#xff0c;但是我感觉功能有点多了&#xff0c;我只需要创建实体的方法即可&#xff0c;假如我想快速将上述表转为如下的Bean对象&#xff0c;该怎么搞…

arcgis api for JavaScript4.2x 在vue中白膜图层的加载、(分类、分段)渲染

这篇文章是对有webgis前端开发经验的人 1、假设之前的三维视图均已成功加载&#xff0c;获取到了三维视图&#xff0c;这里的三维视图变量定义的名字是mapView。&#xff08;PS&#xff1a;三维视图mapview在项目初始化已经设置了&#xff0c;本示例中会直接使用调用结果&…

CentOS 8安装Oracle 19c rpm包

一、环境 centos 8 oracle 19c rpm安装 二、安装前准备 1、创建用户组 groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle2、安装依赖包 如果yum找不到安装包&#xff0c;可以去下载 https://centos.pkgs.org/ 点击跳转 缺少的依赖包可…

Salesforce流程自动化Flow_Pause功能揭秘!

通过自动化&#xff0c;帮助团队提升效率&#xff0c;将员工从那些重复、枯燥、耗时的工作中解放出来&#xff0c;转而从事更具创造性、更有价值的工作&#xff0c;是很多企业数字化转型朴素而又迫切的需求&#xff0c;也是世界No.1 CRM——Salesforce的一大领先优势。 Flow B…

Java集合框架:优先级队列、PriorityQueue详解

目录 一、优先级队列介绍 1. 什么是大根堆&#xff08;大堆&#xff09;和小根堆&#xff08;小堆&#xff09; 2. 堆的性质 二、堆的创建 1. 向下调整建堆 向下调整算法代码实现&#xff1a; 2. 创建大根堆 三、堆的插入和删除&#xff08;向上调整算法&#xff09; …

Linux性能瓶颈分析之TOP指标分析

Linux性能瓶颈分析之TOP指标分析 文章目录 Linux性能瓶颈分析之TOP指标分析一、查看CPU二、监控CPU总结 一、查看CPU 1.查看cpu基础信息 lscpu2.查看cpu详细信息 cat /proc/cpuinfo3.统计cpu信息 cat /proc/cpuinfo |grep "physical id" |sort |uniq |wc -l 查看…

骨传导耳机可以长期佩戴吗,分享几款舒适度极高的骨传导耳机

近几年有一种新型传播方式的耳机&#xff0c;将声音转化为振动&#xff0c;从而让我们的听觉神经感知到。这种声音传播方式叫做"骨传导"&#xff0c;所以叫做骨传导耳机。因为它不需要通过耳膜进行传播声音&#xff0c;所以可以让耳朵在不接触外界的情况下听到声音。…

B051-cms06-退出 回车登录 登录拦截 记住我 SVN

目录 注销功能实现1.找到退出按钮修改请求路径2.后端删除Session并跳转到登录页面 回车登录功能登陆拦截1.编写登录拦截器2.配置拦截器 记住我后端实现页面实现 取消记住我后端实现页面实现 注销功能实现 1.找到退出按钮修改请求路径 header.jsp <% page language"j…

翻过那座山——Jenkins编译发布web程序(.net framework web application)

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不是…

无法登录github解决方法

140.82.113.4 github.com 199.232.69.194 github.global.ssl.fastly.net 185.199.108.153 assets-cdn.github.com 185.199.109.153 assets-cdn.github.com 185.199.110.153 assets-cdn.github.com 185.199.111.153 assets-cdn.github.com 注意以管理员方式运行notepad才能保存 …

Github上标星40K的Java面试笔记,解决95%以上的Java面试

该文档在Github上收获40Kstar的Java面试神技&#xff08;这赞数&#xff0c;质量多高就不用我多说了吧&#xff09;非常全面&#xff0c;包涵Java基础、Java集合、JavaWeb、Java异常、OOP、IO与NIO、反射、注解、多线程、JVM、MySQL、MongoDB、Spring全家桶、计算机网络、分布式…

集成学习(ensemble learning)应如何入门?

集成学习算法之间的主要区别在于以下3个方面: 提供给个体学习器的训练数据不同; 产生个体学习器的过程不同; 学习结果的组合方式不同&#xff0c;从这三个方面去学。 多样性 数据样本多样性&#xff1a;产生数据多样性的方法主要有3种: 输入样本扰动; 输入属性扰动; 输出表示…

掌握Python的常用模块pandas

Pandas 简介 Pandas 是 Python 的核心数据分析支持库&#xff0c;提供了快速、灵活、明确的数据结构&#xff0c;旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具&#xff0c;其长远目标是成为最强大、最灵活、可以支持…

10 编码转换问题

文章目录 字符编码问题编码转换问题ANSI转UnicodeUnicode转ANSIUtf8转 ANSIutf8 转UnicodeANSI 转UTF-8Unicode 转 UTF-8 全部代码 字符编码问题 Windows API 函数 MessageBoxA:MessageBox 内部实现&#xff0c;字符串编码(ANSI)转换成了Unicode,在调用MessageboxW MessageBox:…

助推RASP2.0 领航ADR新赛道 边界无限打造应用安全防护新范式

2023年以来&#xff0c;数字安全一词多次被提及&#xff0c;成为了我们生活和工作中的一项重要课题。近日&#xff0c;由数世咨询、CIO时代联合主办&#xff0c;新基建创新研究院作为智库支持的“第三届数字安全大会”在北京隆重举办&#xff0c;本届大会以“风险驱动”为主题&…