Oracle-day6:over()函数

news2025/1/20 13:35:58

目录

一、over()开窗函数

二、无参over()的使用

三、over(partition by 列名)

四、over(order by 列名 asc/desc)

五、over(partition by 列名  order by 列名 asc|desc)

六、练习(笔试)


一、over()开窗函数

  拓展:数据库的版本
  oracle:8i 9i 10g 11g 12c 18c 19c
  mysql:5.x 8.0 (没有7.x、6.x)
  -- 一、开窗函数 over() ---
  over函数的使用:在select的子句中使用,语法:
  计算函数部分()  over(partition by 列名 order by 列名 asc|desc)  group by
  其中:
  1、计算函数部分:聚合函数、排名函数、平移函数等 只能是一个函数
  2、partition by :分组,不是必选项
  3、order by:排序,不是必选项
  4、over()函数有4种使用方法,即:参数二选一,不带参数,全带参数
*/

二、无参over()的使用

-- 一、开窗函数over()的第一种用法:over()
-- 1、计算函数部分() over():对整个表格进行计算
-- 例题一:查询emp表中的最高工资、最低工资、平均工资
select max(sal),min(sal),avg(sal) from emp
-- 注意:1、聚合函数在一个结果集中计算 返回值是一样  
--          2、over() 新生成的一个列 返回的行数是原来表的行数
select 
empno,sal,
max(sal) over() maxsal,
min(sal) over() minsal,
avg(sal) over() avgsal 
from emp;

 
-- 例题二、找出emp表中工资最高的员工信息
 ----方法1:子查询
   ---a.找出最高的工资
   select max(sal) from emp;  
  ---b.where条件子查询 单行值子查询
   select  * from  emp 
   where sal = (select max(sal) from emp) ;

 ----方法2:开窗函数+from 子查询
   ---a.开窗函数
    select emp.*,max(sal) over() maxsal from emp;
    ---b.from 子查询
    select  * from  
(select emp.*,max(sal) over() maxsal from emp)
    where sal = maxsal;

     ---with as语句
    with a as (select emp1.*,max(sal) over() maxsal from emp1)
    select  * from  a where sal = maxsal;

----方法3:开窗+from 条件子查询
    ---a.开窗
    select emp1.*,max(sal) over() maxsal,sal - max(sal) over() c from emp1;
    ---b.from 条件子查询
    select  * from  
    (select emp1.*,max(sal) over() maxsal,sal - max(sal) over() c from emp1)
where c = 0;

    ---with as 语句
    with a as (select emp1.*,max(sal) over() maxsal,sal - max(sal) over() c from emp1)
    select  * from  a where c = 0;
    
-- 练习三、计算emp表中每个员工你的工资和最高的比值是多少
select emp.*,max(sal) over(),sal/max(sal) over() from emp;
-- 练习四、计算emp表中每个员工的工资和最高工资的差值是多少?
select emp.*,max(sal) over(),sal-max(sal) over() from emp;

三、over(partition by 列名)

-- 使用方式二(带单个参数)、over(partition by 列名)
/*
   partition by 与 group by的区别
   group by会将结果集按照字段进行聚合,结果集会缩减,在统计部门人数,平均工资等会用到
   partition by 会对结果集按照指定字段分层排列,结果集不会缩减,如将公司全部人
*/

-- 在emp表中查询每个部门工资最高的员工信息
-- 1、找出每个部门的最高工资
-- group by 的写法
-- 1.1 对部门分组,同时要保持一致性
select deptno,max(sal)
from emp group by deptno
;
-- 1.2 多列子查询
select * from emp
where(deptno,sal) in(
    select deptno,max(sal)
    from emp group by deptno
)
;

-- 使用开窗函数 over()
-- 1.1 over()
select emp.*,
max(sal) over(partition by deptno) maxsal
from emp;
-- 查询到的数据并不会缩减,每个员工的信息都会多出一列当前部门的最高工资

-- 1.2 加上条件和from查询
select * from(
       select emp.*,
       max(sal) over(partition by deptno) maxsal
       from emp
)where sal = maxsal
;

-- with as写法
with a as(select emp.*,max(sal) over(partition by deptno) maxsal from emp)
select * from a where sal = maxsal;


-- 2、在emp表中计算每个人在部门工资总和中所占的比例
-- 2.1 over()开窗
select emp.*,
sum(sal) over(partition by deptno) sumsal 
from emp
;
-- 2.2 over开窗+form子查询
select * from(
        select emp.*,
        sum(sal) over(partition by deptno) sumsal 
        from emp
);

-- 2.3 求每个人在工资总和中的比例
select empno,ename,sal,sumsal,sal/sumsal
from(
        select emp.*,
        sum(sal) over(partition by deptno) sumsal 
        from emp
);


-- 2.4 四舍五入:round(值,保留小数位)
select empno,ename,sal,sumsal,round(sal/sumsal,2)
from(
        select emp.*,
        sum(sal) over(partition by deptno) sumsal 
        from emp
);

四、over(order by 列名 asc/desc)

   对整个表,对排序的列进行依次的累计运算,并列的名次和数据
   会当成一个整体进行计算(一次性计算)
   
   -- row_number():根据某个列,按照顺序进行排序 1、2、3、4
   -- rank():根据某个列,按照顺序进行排序,如果值相同,会出现并列的名次,会跳过占用的名次:1、2、2、4
   -- dense_rank():根据某个列,按照顺序进行排序,如果值相同,会出现并列的名次,不会跳过名次:1、2、2、3
   --rownum 取行号函数(系统关键字)只能 <= 不能 > 从1开始可以 >=

-- 1、对row_number列以sal排序
select emp.*,row_number() over(order by sal) from emp;

-- 2、对 rank()列以sal排序
select emp.*, rank() over(order by sal) from emp;

-- 3、对dense_rank()列以sal排序
select emp.*,dense_rank() over(order by sal) from emp;

-- 4、rownum 以sal升序排序(这个需要用到子查询)
select a.*,rownum r from
(select * from emp order by sal) a;


-- 5、练习:在成绩表中查询c001课程成绩的前6~10名


-- 5.1、查询到coo1的成绩排序
select * from sc_a01;
select sc_a01.*,row_number() over(partition by cno order by score desc)
from sc_a01
where cno = 'c001'
;

-- 5.2 合并子查询
select * from (
       select sc_a01.*,row_number() over(partition by cno order by score desc) r
       from sc_a01
       where cno = 'c001'
)where r between 6 and 10;

五、over(partition by 列名  order by 列名 asc|desc)

/*
   over(partition by 列名  order by 列名 asc|desc):
   在每个分组中,对排序的列进行依次的累计运算,并列的名次和数据,会当成一个整体进行计算
*/

-- 1、在emp表中,找出每个部门的最高工资,对应的员工信息
select * from (
       -- 子查询
       select emp.*,max(sal) over(partition by deptno order by sal desc) maxsal
       from emp
)where sal = maxsal;


-- 2、在emp表中找出每个部门的员工的工资和该部门最高工资的差值
select emp.*,max(sal) over(partition by deptno order by sal desc) maxsal,
sal-max(sal) over(partition by deptno order by sal desc) cha from emp;


-- 3、在成绩表中计算每门课程前 1-10名的信息
-- 3.1 对成绩做出排序
select a.*,row_number() over(partition by cno order by score desc) r 
from sc_a01 a
;

-- 3.2 合并子查询
select * from(
       select a.*,row_number() over(partition by cno order by score desc) r 
       from sc_a01 a
)where r between 1 and 10;


-- 4、在成绩表中计算每门课程前1-10名的总分
-- 4.1 已查询到每门课程的前10名
select * from(
       select a.*,row_number() over(partition by cno order by score desc) r 
       from sc_a01 a
)where r between 1 and 10;

-- 4.2 再此基础上加上分组计算
select cno,sum(score) from(
       select a.*,row_number() over(partition by cno order by score desc) r 
       from sc_a01 a
)
where r between 1 and 10
group by cno
;

select * from emp;
-- 5、在emp表中计算每个部门前六名的工资总和
select deptno,sum(sal) from(
       select e.*,row_number() over(partition by deptno order by sal desc) r
       from emp e
)
where r <= 60
group by deptno
;

六、练习(笔试)

/*
      二、练习题
      -- case when 条件判断
      case
      when 条件判断1 then 条件为真
      when 条件判断2 then 条件为真
      ...
      else 所有条件都为假的时候
      end
      else 可以省略,可以生成一个或多个列
      
*/
-- 1、建表填入数据
create table info(
       id number,
       name varchar(20)
)
select * from info;
insert into info values(1,'/');
insert into info values(2,'A');
insert into info values(3,'B');
insert into info values(4,'C');
insert into info values(5,'/');
insert into info values(6,'D');
insert into info values(7,'E');
insert into info values(8,'/');
insert into info values(9,'F');
insert into info values(10,'C');
insert into info values(11,'H');


-- 方法一、
-- 1.1、筛选出不包含/的数据
select * from info where name <> '/';

-- 1.2、使用case when语句
select id,name,case
                         when id between 2 and 4 then 1
                         when id between 6 and 7 then 2
                         when id between 9 and 11 then 3
                         end group_id  
from info where name <> '/';


-- 方法二、
-- 2.1 单个结果的查询
select id,name,1 group_id from info where id between 2 and 4;
select id,name,2 group_id from info where id between 6 and 7;
select id,name,3 group_id from info where id between 9 and 11;

-- 2.2 拼接三个查询结果:使用 union all
select id,name,1 group_id from info where id between 2 and 4
union all
select id,name,2 group_id from info where id between 6 and 7
union all
select id,name,3 group_id from info where id between 9 and 11;


-- 方法三、开窗
-- 3.1 筛选没有 / 的
select id,name from info where name <> '/';

-- 3.2 对id排序
select id,name,row_number() over(order by id) r from info where name <> '/';

--- 3.3完善--用id-row_number 刚好就可以满足到题目条件,再以group_id分组
select 
id,name,row_number() over(order by id) r,id-row_number() over(order by id) group_id
from info 
where name <> '/'
;

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

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

相关文章

ICCV 2023 | 小鹏汽车纽约石溪:局部上下文感知主动域自适应LADA

摘要 主动域自适应&#xff08;ADA&#xff09;通过查询少量选定的目标域样本的标签&#xff0c;以帮助模型从源域迁移到目标域。查询数据的局部上下文信息非常重要&#xff0c;特别是在域间差异较大的情况下&#xff0c;然而现有的ADA方法尚未充分探索这一点。在本文中&#…

六、事务-4.并发事务问题

一、脏读 事务A执行3个操作&#xff0c;第1个操作执行select语句&#xff0c;第2个操作执行update语句。 注意&#xff1a;事务没有执行完成的时候&#xff0c;事务是没有提交的。只有事务的3个操作完成之后&#xff0c;事务才会提交。 但事务A中第2个操作&#xff0c;会把表…

改进YOLOv8系列:原创改进创新点 SIoU-NMS,EIoU-NMS,DIoU-NMS,CIoU-NMS,GIoU-NMS改进

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv8独家原创改进:原创改进创新点 DIoU-NMS,SIoU-NMS,EIoU-NMS,CIoU-NMS,GIoU-NMS改进。 💡对自己数据集改进有效的话,可以直接当做自己的原创改…

机器学习笔记之最优化理论与方法(二)凸集的简单认识(上)

机器学习笔记之最优化理论与方法——凸集的简单认识[上] 引言凸优化问题与凸集合凸函数的关系凸优化问题简单示例凸集的简单示例 基本定义&#xff1a;凸集关于凸集性质的等价条件&#xff0c;凸组合&#xff0c;凸包常见凸集 引言 本节将介绍关于凸集的基本信息&#xff0c;包…

【Java】基础入门 (十六)--- 异常

1.异常 1.1 异常概述 异常是指程序在运行过程中出现的非正常的情况&#xff0c;如用户输入错误、除数为零、文件不存在、数组下标越界等。由于异常情况再程序运行过程中是难以避免的&#xff0c;一个良好的应用程序除了满足基本功能要求外&#xff0c;还应具备预见并处理可能发…

青翼科技基于VITA57.1的16路数据收发处理平台产品手册

FMC211是一款基于VITA57.1标准规范的实现16路LVDS数据采集、1路光纤数据收发处理FMC子卡模块。 该板卡支持2路CVBS&#xff08;复合视频&#xff09;视频输入&#xff0c;能够自动检测标准的模拟基带电视信号&#xff0c;并将其转变为8位ITU-R.656接口信号或者4:2:2分量视频信…

Qt网络通信——获取本机网络信息

查询一个主机的MAC地址或者IP地址是网络应用中常用到的功能&#xff0c;Qt提供了QHostInfo和QNetworkInterface 类可以用于此类信息的查询 1.QHostInfo 类&#xff08;显示和查找本地的信息&#xff09;是的主要函数 类别 函数原型作用公共函数QList <QHostAdress> addr…

读<一例 Go 编译器代码优化 bug 定位和修复解析>

看到一例 Go 编译器代码优化 bug 定位和修复解析[1]这样一篇文章,感觉有些意思. 在此复现和记录 在Go 1.16版本下,是没有这个bug[2]的(已修复). 参照gvm:灵活的Go版本管理工具[3] 将Go版本切至有问题的1.13.5(或1.14.6) ➜ go versiongo version go1.13.5 darwin/amd64 packag…

Node常用内置模块之url模块和querystring模块

1、URL类 url模块在v16的nodejs中已经明确被废弃&#xff0c;在将来的升级node中&#xff0c;可能被不支持。 官网建议在废弃url、querystring模块后&#xff0c;采用URL类去替代。 图示 URL 各部分 旧版的url模块 作用&#xff1a;url 模块是用于处理和解析 URL 的模块&…

Unity ShaderGraph教程——基础shader

1.基本贴图shader&#xff1a; 基础贴图实现&#xff1a;主贴图、自发光贴图、光滑度贴图、自发光贴图&#xff08;自发光还加入了颜色影响和按 钮开关&#xff09;. 步骤&#xff1a;最左侧操作组——新建texture2D——新建sample texture 2D承…

Linux上部署zentao禅道18.6版本

1. cd /opt 2. 下载 ZenTaoPMS-18.6-zbox_amd64.tar.gz wget https://dl.cnezsoft.com/zentao/18.6/ZenTaoPMS-18.6-zbox_amd64.tar.gz 3. 解压 tar -zxvf ZenTaoPMS-18.6-zbox_amd64.tar.gz 4. 解压成功, 可以看到多了个zbox文件 5. cd zbox/ 进入该目录 6. 修改apache默认…

乙酰基六肽-18——刺激脂肪合成,增加指定部位脂肪,塑造完美曲线

简介 乙酰六肽-18&#xff08;丰胸肽&#xff09;为一种乙酰化的六肽&#xff0c;可显著刺激使用部位脂肪合成&#xff0c;增大胸部或脸颊的体积&#xff0c;塑造完美身材。 INCI 名称 乙酰六肽-18 分子式 C30H54N9O10 分子量 700.32 CAS号 1400634-44-7…

WPF_布局基础

布局容器 Grid 定义由列和行组成的灵活的网格区域。 行 <Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions> 列 <Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDe…

免费开源MES系统|自动排产管理

万界星空科技免费MES系统助力企业实现生产排程自动化&#xff0c;降低人力成本。生产计划排产管理是指制定一个可行的生产计划并按照该计划安排生产资源和制造活动的过程。 它是制造企业管理中的一个关键过程&#xff0c;涉及到计划制定、资源管理、物料采购、工厂布局、生产调…

手搓的一款基于sql脚本的数据初始化组件

产口孵化新项目时&#xff0c;表中需要提前预置部份数据。如字典&#xff0c;角色、菜单、配置等。以达到快速布署的目的。这部份数据会随着某些因素的影响。如地区变化、系统定制方面。无法使用统一的一份sql。旧方案是在代码里面动态的作insert操作。在项目启动的时候初始化这…

IPIDEA确认参加2023 CCEE(深圳)雨果跨境全球电商展览会

9月1日—9月3日&#xff0c;雨果跨境将在深圳会展中心&#xff08;福田&#xff09;举办 “2023CCEE&#xff08;深圳&#xff09;雨果跨境全球电商展览会”。 届时&#xff0c;IPIDEA将参加此次跨境年度盛会。作为一家专业的全球HTTP代理商&#xff0c;IPIDEA为与会商家准备了…

MES管理系统数据建模有哪些注意事项

在进行MES管理系统数据建模时&#xff0c;需要注意以下几个方面&#xff0c;以确保建立高效、可靠且适应性强的数据模型&#xff0c;为企业的生产管理提供有力的支持。 首先&#xff0c;精确理解业务需求是进行数据建模的前提。与相关部门和人员进行充分的沟通&#xff0c;了解…

基于web的图书管理系统java书店进销存 jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于web的图书管理系统 系统有1权限:管理员 二、主要…

小程序中如何给会员发送微信服务通知

通过发送微信服务通知&#xff0c;可以及时向会员推送最新的活动、优惠信息等重要通知&#xff0c;从而增加用户参与度和购买意愿。下面就介绍怎么给会员发送微信服务通知的方法和步骤。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要接收服务通知的…

【Navicat Premium 16】使用Navicat将excel的数据进行单表的导入,详细操作

业务场景&#xff1a;经常与数据打交道嘛&#xff0c;有的时候会需要将excel的数据导入到数据库中&#xff0c;后面发现对于单表的数据导入&#xff0c;使用Navicat还是非常方便的&#xff0c;仅仅需要将字段关系映射好就可以了 一、开始操作 前提条件&#xff1a;已经成功连接…