MySQL学习八:窗口函数(一)

目录

  • 一、窗口函数
    • 1. 窗口函数定义
    • 2. 窗口函数语法
    • 3. 演示表格一
    • 4. 窗口的确定
      • 4.1 例1:查询各班级总分
      • 4.2 例2:查询各班级累计总分
      • 4.3 分区子句(partition by)
      • 4.4 排序子句(order by)
      • 4.5 窗口子句(rows)
      • 4.6 总体执行流程
    • 5. 函数分类
      • 5.1 排序类函数
      • 5.2 聚合类函数
      • 5.3 跨行类函数
  • 二、相关题目练习
    • 6. 演示表格二
    • 7. 演示表格三
  • 三、窗口函数问题与技巧总结

一、窗口函数

1. 窗口函数定义

窗口限定一个范围,可以理解为满足某些条件的记录集合。窗口函数也就是在窗口范围内的执行的函数

2. 窗口函数语法

窗口函数有 over 关键字,指定函数执行的范围。可分为三部分:分组字句 (partition by),排序字句 (order by),滑动窗口字句 (rows)

<函数名> over (partition by <分组的列名>, order by <排序的列名> rows between <起始行> and <终止行>)

3. 演示表格一

create table gradeInfo1 (cid varchar(32),sname varchar(32),score int
);insert into gradeInfo1 (cid, sname, score)
values
('001', '张三', 78),
('001', '李四', 82),
('002', '小明', 90),
('001', '王五', 67),
('002', '小红', 85),
('002', '小刚', 90);
cid(班级id)sname (学生姓名)score(分数)
001张三78
001李四82
002小明90
001王五67
002小红85
002小刚90

4. 窗口的确定

4.1 例1:查询各班级总分

# 方法一
select *,
sum(score) over(partition by cid) as 班级总分
from gradeinfo1# 方法二
select *, 
sum(score) over(partition by cid order by score rows between unbounded preceding and unbounded following) as 班级总分
from gradeinfo1

在这里插入图片描述

4.2 例2:查询各班级累计总分

# 方法一
select *,
sum(score) over(partition by cid order by score) as 班级总分
from gradeinfo1# 方法二
select *,
sum(score) over(partition by cid order by score rows between unbounded preceding and current row) as 班级总分
from gradeinfo1

在这里插入图片描述

4.3 分区子句(partition by)

① 不分区可以写成 partition by null,或者直接不写
② 后面可以跟多个列,例如 partition by cid, sname
partition by 和 group by的区别: partition by 不将行数去重,group by 会将行数去重

4.4 排序子句(order by)

① 不排序可以写成 order by null,或者直接不写
② 后面可以跟多个列,例如 order by cid, sname

4.5 窗口子句(rows)

语法概述:
① 起始行:N preceding / unbounded preceding
② 当前行:current row
③ 终止行:N following / unbounded following
举例:
① 从分区内的前面所有行到当前行:rows between unbounded preceding and current row
② 从分区内的前面 2 行 到当前行:rows between 2 preceding and current row
③ 从分区内的当前行到后面所有行:rows between current row and unbounded following
④ 从分区内的当前行到后面 3 行:rows between current row and 3 following
注意:
① 若排序字句后缺少窗口字句,窗口规范默认为:rows between unbounded preceding and current row
② 若排序字句和窗口字句都缺少,窗口规范默认为:rows between unbounded preceding and unbounded following

4.6 总体执行流程

① 通过 partition by 个 order by 确定大窗口(定义出上界和下界)
② 通过 rows 字句针对每一行数据,确定小窗口(即滑动窗口)
③ 针对每行的小窗口内的数据,执行函数并生成新的列

5. 函数分类

5.1 排序类函数

① row_number:序号不重复,且序号连续(即连续排名,不考虑并列)。例如:1,2,3 …
② rank:序号可重复,且序号不连续(即跳跃排名,考虑并列)。例如:1,2,2,4 …
③ dense_rank:序号可重复,且序号连续(即连续排名,考虑并列)。例如:1,2,2,3 …

# 对每个班级的学生成绩进行排名
select *,
row_number() over(partition by cid order by score desc) as 不并列排名,
rank() over(partition by cid order by score desc) as 跳跃可并列排名,
dense_rank() over(partition by cid order by score desc) as 连续可并列排名
from gradeinfo1

在这里插入图片描述

5.2 聚合类函数

sum,avg,count,max,min

5.3 跨行类函数

① lead (比较的列,N):返回当前行的后面 N 行
② lag (比较的列,N):返回当前行的前面 N 行

# 每个班级中,成绩比自己高一名的成绩是多少
select *,
lag(score, 1) over(partition by cid order by score desc) as 高一名的分数
from gradeinfo1

在这里插入图片描述

二、相关题目练习

6. 演示表格二

create table gradeInfo2 (cid varchar(32),sname varchar(32),course varchar(32),score int
);insert into gradeInfo2 (cid, sname, course, score)
values
('001', '张三', '语文', 78),
('002', '小刚', '语文', 71),
('001', '李四', '数学', 56),
('001', '王五', '数学', 97),
('002', '小明', '数学', 54),
('002', '小刚', '数学', 67),
('002', '小红', '数学', 82),
('001', '王五', '语文', 80),
('001', '张三', '数学', 77),
('002', '小明', '语文', 58),
('002', '小红', '语文', 87),
('001', '李四', '语文', 60),
('001', '张三', '英语', 66),
('002', '小刚', '英语', 50),
('001', '李四', '地理', 59),
('001', '王五', '地理', 88),
('002', '小明', '地理', 45),
('002', '小刚', '地理', 66),
('002', '小红', '地理', 82),
('001', '王五', '英语', 81),
('001', '张三', '地理', 77),
('002', '小明', '英语', 55),
('002', '小红', '英语', 87),
('001', '李四', '英语', 61)
cid(班级id)sname (学生姓名)course(学科)score(分数)
001张三语文78
002小刚语文71
001李四数学56
001王五数学97
002小明数学54

题目一:查询每个学生成绩最高的三个学科(分组内 Top N 问题)

select *
from(select *,row_number() over(partition by sname order by score desc) as rankingfrom gradeinfo2
) a
where ranking <= 3

在这里插入图片描述

题目二:查询每个学科都高于班级学科平均分的学生(汇总分析问题)

select sname
from(select *, score - course_avg_score as delfrom(select *,avg(score) over(partition by cid, course) as course_avg_scorefrom gradeinfo2) t1
) t2
group by sname
having min(del) > 0 

在这里插入图片描述

7. 演示表格三

create table employee(empno varchar(32),ename varchar(32),hire_date varchar(32),salary int,dept_no varchar(32)
);insert into employee(empno, ename, hire_date, salary, dept_no)
values
('001', 'Adam', '2018-03-01', 1000, 'A'),
('002', 'Bill', '2021-03-01', 1200, 'A'),
('003', 'Cindy', '2016-03-01', 1500, 'A'),
('004', 'Danney', '2020-03-01', 5000, 'A'),
('005', 'Eason', '2020-03-01', 4000, 'B'),
('006', 'Fred', '2018-03-01', 3500, 'B'),
('007', 'Gary', '2017-03-01', 1800, 'B'),
('008', 'Hugo', '2020-03-01', 4500, 'B')
empnoenamehire_datesalarydept_no
001Adam2018-03-011000A
002Bill2021-03-011200A
003Cindy2016-03-011500A
004Danney2020-03-015000A
005Eason2020-03-014000B
006Fred2018-03-013500B
007Gary2017-03-011800B
008Hugo2020-03-014500B

题目一:查询每个部门工资最高的前三个员工信息(分组内 Top N 问题)

select *
from(select *,rank() over(partition by dept_no order by salary desc) as rankingfrom employee
) a
where ranking <= 3

在这里插入图片描述

题目二:查询员工工资占所属部门总工资的百分比(汇总分析问题)

select *, 
concat(round(salary/total_salary*100, 3), '%') as salary_percent
from(select *,sum(salary) over(partition by dept_no) as total_salaryfrom employee
) a

在这里插入图片描述

题目三:对各部门员工的工资进行升序排列,排名前 30% 为底层,30% - 80% 为中层,80% 以上为高层,并打上标签

select *,
casewhen ranking_percent < 0.3 then '底层'when ranking_percent between 0.3 and 0.8 then '中层'else '高层'end as label
from(select *, round(ranking/total_employee, 2) as ranking_percentfrom(select *,rank() over(partition by dept_no order by salary) as ranking,count(empno) over(partition by dept_no) as total_employeefrom employee) a
) b

在这里插入图片描述

题目四:查询每年入职总数以及截至本年累计入职总人数(本年总入职人数 + 本年之前所有年的入职人数之和)

# 方法一
# 创建临时表
with
a as(select year(hire_date) as 入职年份, count(empno) as 入职员工数 from employeegroup by 入职年份order by 入职年份
)select *,
sum(入职员工数) over(rows between unbounded preceding and current row) as 累计入职总人数
from a# 方法二
select *,
sum(入职员工数) over(rows between unbounded preceding and current row) as 累计入职总人数
from(select year(hire_date) as 入职年份, count(empno) as 入职员工数 from employeegroup by 入职年份order by 入职年份
) a

在这里插入图片描述

三、窗口函数问题与技巧总结

① 本文用窗口函数解决的 2 个主要问题:分区内 Top N 问题,汇总分析问题

② 分区内 Top N 公式

select *
from(select *,row_number() over(partition by 分区列 order by 比较列) as rankingfrom gradeinfo2
) a
where ranking <= N

③ 窗口函数 → 生成辅助列(用于计算百分比等)

④ 重要:with 子句 → 生成临时表,把复杂的问题拆分成多个子问题,再用临时表表达

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

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

相关文章

单片机-- 数电(3)

编码器与译码器 译码 &#xff1a;将二进制代码转化为其他进制的代码 编码 &#xff1a;就是将其他代码转换为二进制码 编码器的类型 1二进制编码器 用n位二进制数码对2的n次方个输入信号进行编码的电路 2二-十进制编码器 将0到9十个十进制数转化为二进制代码的电路 2…

crossover虚拟机 crossover软件干嘛的 虚拟机软件的使用方法 mac虚拟机装windows

与传统的虚拟机软件&#xff08;如VMware、VirtualBox&#xff09;相比&#xff0c;CrossOver具有更高的运行效率和更好的用户体验。因为它并不创建一个完整的Windows虚拟机&#xff0c;而是仅模拟应用程序所需的运行环境。这使得CrossOver在启动和运行Windows应用程序时更加快…

手撕HashMap底层源码(学习内容全)

day28上 集合框架 标绿已经学习底层&#xff0c;深入底层主要是研究实现类底层 手撕HashMap底层源码 JDK1.7版本的HashMap为例&#xff08;注意实验代码时进行版本切换&#xff09; 代码注释参考理解 //day27初识 public class HashMap<K,V> extends AbstractMap<K,…

SpringBoot3整合Mybatis-Plus与PageHelper包冲突解决

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot3整合Mybatis-Plus与PageHelper包冲突解决 ⏱️ 创作时间&a…

Elasticsearch - Docker安装Elasticsearch8.12.2

前言 最近在学习 ES&#xff0c;所以需要在服务器上装一个单节点的 ES 服务器环境&#xff1a;centos 7.9 安装 下载镜像 目前最新版本是 8.12.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2创建配置 新增配置文件 elasticsearch.yml http.host…

大模型时代,微软AI投资的布局

这些领域涉及 3D、代码、销售、游戏等多个行业。其中&#xff1a; 在 3D 领域&#xff0c;blackshark.ai 利用 AI 技术提供地理空间数据解决方案&#xff1b;humane 专注于人机交互技术创新&#xff1b;Builder.ai 提供了无需编程知识的应用构建平台。代码方面&#xff0c;GitH…

Java基础学习笔记三

环境变量CLASSPATH classpath环境变量是隶属于java语言的&#xff0c;不是windows操作系统的&#xff0c;和PATH环境变量完全不同classpath环境变量是给classloader&#xff08;类加载器&#xff09;指路的java A 。执行后&#xff0c;先启动JVM&#xff0c; JVM启动classload…

GIS学习

匹配查询&#xff0c;先连接两个表&#xff0c;然后在一个表里面查询 合并两个形状 比较好的colormap http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html https://docs.gmt-china.org/latest/cpt/builtin-cpt/ 计算坡度时就要捕捉栅格 重分类时也要捕捉栅…

数据结构:10、排序

本文将会介绍8种排序&#xff0c;并在文章末附上代码 一、排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;…

[蓝桥杯 2019 省 A] 外卖店优先级

模拟 双指针 #include<iostream> #include<algorithm> using namespace std; using ll long long; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; const int mod 1e97;int n,m,ts;bool vis[N]; int a[N]; int last[N]; pair<int,int…

外卖项目:菜品管理功能代码实现(debug)

文章目录 一、菜品管理功能代码实现1、新增菜品2、菜品分页查询3、修改菜品4、菜品的起售与停售5、删除菜品 一、菜品管理功能代码实现 1、新增菜品 这涉及到多张表&#xff0c;要用事务 添加成功 2、菜品分页查询 3、修改菜品 该页面共涉及4个接口。 接口&#xff1a; 根…

protobuf原理解析-基于protobuf-c实现序列化,反向序列化

1.一个实例 前面介绍了使用protobuf的流程&#xff0e; (1). 定义proto文件来描述需要序列化和反向序列化传输的消息&#xff0e; (2). 借助proto-c&#xff0c;为proto文件生成对应的代码控制文件&#xff0e; (3). 程序借助生成的代码控制文件和protobuf-c动态库的支持实现类…

如何写出干净的 Git Commit

大家好&#xff0c;我是楷鹏。 写一份干净的 Git Commit&#xff0c;不仅赏心悦目&#xff0c;也有诸多好处&#xff0c;比如 为项目或者仓库生成 change log方便在其他一些 Git 工具使用&#xff0c;比如 CI/CD、代码协作和审计平台、发版工具等 这是 AngularJS 仓库的 Git …

短视频矩阵系统技术交付

短视频矩阵系统技术交付&#xff0c;短视频矩阵剪辑矩阵分发系统现在在来开发这个市场单个项目来说&#xff0c;目前基本上已经沉淀3年了&#xff0c;那么我们来就技术短视频矩阵剪辑系统开发来聊聊 短视频矩阵系统经过315大会以后&#xff0c;很多违规的技术开发肯定有筛选到了…

[ C++ ] STL---string类的使用指南

目录 前言&#xff1a; string类简介 string类的常用接口 string类对象的构造函数 string类对象的赋值运算符重载 string类对象的容量操作 string类对象的访问与遍历 [ ] 下标遍历 迭代器遍历 普通迭代器iterator ​编辑 const迭代器const_iterator 反向迭代器rever…

常见的WAFI攻击包括哪些

WIFI攻击是指黑客利用各种手段&#xff0c;对WIFI网络进行非法入侵和攻击&#xff0c;以获取用户的个人信息、网络权限或其他敏感数据。常见的WIFI攻击方式主要包括以下几种&#xff1a;伪造认证页面&#xff1a;黑客可以创建一个伪造的认证页面&#xff0c;当用户尝试连接到WI…

Vue2(三):绑定样式、条件渲染(v-if,v-show)、列表渲染(v-for)、key的原理、列表过滤、列表排序

一、绑定样式 1.绑定class样式 (1)字符串写法 适用于&#xff1a;样式类名不确定&#xff0c;需要动态获取。 <div id"root"><div class"basic" :class"mood" click"changeMood">test</div><!-- class是原本的…

Android Studio实现内容丰富的安卓旅游景点预定

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 1.开发环境 android stuido3.6 jak1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看景点列表 3.查看景点详情 4.景点预定 5.购物车支付结算功能 6…

计算机网络:计算机网络概述

计算机网络&#xff1a;计算机网络概述 因特网概述网络&#xff0c;互连网&#xff0c;因特网因特网发展的三个阶段因特网的标准化工作因特网组成 计算机网络的定义计算机网络的分类按使用者分类按传输介质分类按网络的覆盖范围分类按拓扑结构分类 因特网概述 网络&#xff0c…

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…