Oracle-day6:over()函数

目录

一、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) maxsalfrom 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) rfrom sc_a01where 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) maxsalfrom 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) rfrom emp e
)
where r <= 60
group by deptno
;

六、练习(笔试)

/*二、练习题-- case when 条件判断casewhen 条件判断1 then 条件为真when 条件判断2 then 条件为真...else 所有条件都为假的时候endelse 可以省略,可以生成一个或多个列*/
-- 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,casewhen id between 2 and 4 then 1when id between 6 and 7 then 2when id between 9 and 11 then 3end 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.mzph.cn/news/65030.shtml

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

相关文章

信息化发展16

计算机网络 从网络的作用范围可将网络类别划分为个人局域网&#xff08; Per sona l Area Net work,PAN) &#xff1e;局域网C Local Area Net work, LAN ) &#xff1e; 城域网&#xff08; Metropoli tan Areaetwork , MAN &#xff09; 、广域网&#xff08; Wide Area Net…

王道考研数据结构

文章目录 C 环境准备官方文档环境准备在线运行VSCode 环境报错解决 绪论线性表顺序表链表错题 栈、队列和数组栈队列栈的应用之中缀转后缀特殊矩阵用数组压缩存储错题 串模式匹配之暴力和KMP 树与二叉树二叉树树和森林哈夫曼树和哈夫曼编码并查集错题 图图的基本概念图的存储及…

Python 新版本有75个内置函数,你不会不知道吧

目录 Python 内置函数 前言 属性分类 模块 module 29. format() 35. help() 对象 object 17. copyright() 18. credits() 26. exit() 44. license() 59. quit() 类 class 08. bool() 10. bytearray() 11. bytes() 14. classmethod() 16. complex() 20. dict…

记一次postgres导致cpu100%

周末想打两把训练赛&#xff0c;没想到朋友发来一个截图 我&#xff1a;嗯&#xff1f;&#xff1f;wtf 于是我上服务器看了一下日志&#xff0c;诶我超&#xff0c;还真的 查看进程详情 [rootiZ7xv7q4im4c48qen2do2bZ project]# pstree -tp postgres memory(904475)─┬─…

【Spring面试题】IOC控制反转和DI依赖注入(详解)

IOC Inversion of Control 控制反转&#xff0c;是一种面向对象的思想。 控制反转就是把创建和管理 bean 的过程转移给了第三方。而这个第三方&#xff0c;就是 Spring IoC Container&#xff0c;对于 IoC 来说&#xff0c;最重要的就是容器。 通俗点讲&#xff0c;因为项目…

Xubuntu16.04系统中解决无法识别exFAT格式的U盘

问题描述 将exFAT格式的U盘插入到Xubuntu16.04系统中&#xff0c;发现系统可以识别到此U盘&#xff0c;但是打不开&#xff0c;查询后发现需要安装exfat-utils库才行。 解决方案&#xff1a; 1.设备有网络的情况下 apt-get install exfat-utils直接安装exfat-utils库即可 2.设备…

ZigBee案例笔记 -- RFID卡片读写(模拟饭卡)

RFID模拟饭卡应用 RFID&#xff08;射频识别技术&#xff09;RFID通讯协议RFID发展历史RFID操作流程说明RFID卡片读写流程RFID寻卡RFID防碰撞RFID选卡RFID卡密验证RFID读卡RFID写卡读写数据流程 RFID饭卡模拟案例驱动代码串口协议饭卡操作案例结果优化建议 RFID&#xff08;射频…

C语言入门 Day_12 一维数组

目录 前言 1.创建一维数组 2.使用一维数组 3.易错点 4.思维导图 前言 存储一个数据的时候我们可以使用变量&#xff0c; 比如这里我们定义一个记录语文考试分数的变量chinese_score&#xff0c;并给它赋值一个浮点数&#xff08;float&#xff09;。 float chinese_scoe…

详细介绍如何基于ESP32实现低功耗的电子纸天气显示器--附完整源码

实现界面展示 这是一款天气显示器,由支持 wifi 的 ESP32 微控制器和 7.5 英寸电子纸(又名电子墨水)显示器供电。当前和预测的天气数据是从 OpenWeatherMap API 获取的。传感器为显示屏提供准确的室内温度和湿度。 该项目在睡眠时消耗约 14μA,在约 10 秒的清醒期…

GitHub打不开解决方法——授人以渔

打不开GitHub的原因之一&#xff0c;DNS地址解析到了无法访问的ip。&#xff08;为什么无法访问&#xff1f;&#xff09; 1、打开GitHub看是哪个域名无法访问&#xff0c;F12一下 2、DNS解析看对应的域名目前哪个IP可以访问 DNS解析的网址&#xff1a; &#xff08;1&#x…

上海的正西边有哪些城市

背景 上海一路向西&#xff0c;来一趟拉萨之行&#xff0c;那么上海出现&#xff0c;所经过的那么多城市&#xff0c;哪些是在上海的正西边呢&#xff1f; 画一幅地图 基于这个背景需求&#xff0c;我们需要拿来一幅地图&#xff0c;一看便知。下面的python代码生成了一幅地…

Ubuntu升级Cmake、gcc、g++

背景 最近要安装llvm&#xff0c;我选择的是从源码安装&#xff0c;所以要使用Cmake进行构建项目。但是服务器上的Cmake、gcc、g的版本都太低了&#xff0c;不符合要求&#xff0c;所以要对此进行升级。在本博客中采用的升级方法不一定是最好的方法&#xff08;因为我也是参考…

跨数据中心Multi-Fabric解决方案:L2和L3网络的高效连接和扩展

云数据中心里&#xff0c;为什么需要DCI互通&#xff1f; 云化数据中心&#xff0c;网络资源通过虚拟化技术形成资源池&#xff0c;实现业务与物理网络解耦&#xff0c;通过网络虚拟化&#xff0c;物理网络资源可以被分成多个虚拟网络资源&#xff0c;从而提高网络资源的使用效…

操作系统的发展和分类

注意&#xff1a;每个阶段的主要优点都是解决了上个阶段的缺点 1.手工操作阶段 概括&#xff1a;一个用户在一段时间内独占全机&#xff0c;导致资源利用率极低&#xff0c;用户输入指令给机器&#xff0c;然后机器运行响应给用户。 2.批处理阶段 2.1单道批处理系统 优点&…

【LeetCode】85.最大矩形

题目 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1&quo…

图解 STP

网络环路 现在我们的生活已经离不开网络&#xff0c;如果我家断网&#xff0c;我会抱怨这什么破网络&#xff0c;影响到我刷抖音、打游戏&#xff1b;如果公司断网&#xff0c;那老板估计会骂娘&#xff0c;因为会影响到公司正常运转&#xff0c;直接造成经济损失。网络通信中&…

基于Matlab利用IRM和RRTstar实现无人机路径规划(附上源码+数据+说明+报告+PPT)

无人机路径规划是无人机应用领域中的关键问题之一。本文提出了一种基于IRM&#xff08;Informed RRTstar Method&#xff09;和RRTstar&#xff08;Rapidly-exploring Random Tree star&#xff09;算法的无人机路径规划方法&#xff0c;并使用Matlab进行实现。该方法通过结合I…

设计模式行为型-状态模式

文章目录 简介状态模式基础定义状态接口或抽象类实现具体状态类 上下文类与状态转换上下文类的定义和作用状态转换及触发条件 状态模式的优势与适用性优点一&#xff1a;可维护的代码优点二&#xff1a;清晰的状态管理适用场景一&#xff1a;对象拥有多个状态适用场景二&#x…

【Unity】常见的角色移动旋转

在Unity 3D游戏引擎中&#xff0c;可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式&#xff1a; 欧拉角&#xff08;Euler Angles&#xff09;&#xff1a;欧拉角是一种常用的旋转表示方法&#xff0c;通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Un…

区块链技术与应用 - 学习笔记1【引言】

大家好&#xff0c;我是比特桃。本系列主要将我之前学习区块链技术时所做的笔记&#xff0c;进行统一的优化及整合。其中大量笔记源于视频课程&#xff1a;北京大学肖臻老师《区块链技术与应用》公开课。肖老师的课让我找回了求知若渴般的感觉&#xff0c;非常享受学习这门课的…