当前位置: 首页 > news >正文

Mysql-窗口函数一

文章目录

  • 1. 窗口函数概述
    • 1.1 介绍
    • 1.2 作用
  • 2. 场景说明
    • 2.1 准备工作
    • 2.2 场景说明
    • 2.3 分析
    • 2.4 实现
      • 2.4.1 非窗口函数方式实现
      • 2.4.2 窗口函数方式实现
  • 3. 窗口函数分类
  • 4. 窗口函数基础用法:OVER关键字
    • 4.1 语法
    • 4.2 场景一 :计算每个值和整体平均值的差值
      • 4.2.1 需求
      • 4.2.2 分析
      • 4.2.3 实现
    • 4.3 场景二: 计算每个值占整体之和的占比
      • 4.3.1 需求
      • 4.3.2 分析
      • 4.3.3 非窗口函数实现
      • 4.3.4 窗口函数实现
  • 5. PARTITION BY分区
    • 5.1 场景说明
    • 5.2 语法
    • 5.3 分析
    • 5.4 非窗口函数实现
    • 5.5 窗口函数实现
    • 5.6 GROUP BY 与 PARTITION BY的区别
  • 6. 排名函数:产生排名
    • 6.1 场景说明
    • 6.2 准备工作
    • 6.3 语法
    • 6.3 分析
    • 6.4 实现
      • 6.4.1 非窗口函数方式实现
      • 6.4.2 窗口函数方式实现
        • 6.4.2.1 ==rank==
        • 6.4.2.2 ==dense_rank==
        • 6.4.2.3 ==row_number==
        • 6.4.2.4 总结
  • 7. PARTITION BY和排名函数
    • 7.1 场景说明
    • 7.2 分析
    • 7.3 实现
      • 7.3.1 非窗口函数实现
      • 7.3.2 窗口函数实现
  • 8. 排名 练习一
    • 8.1 准备工作
    • 8.2 需求: 去掉最高分和去掉最低分 求平均分
    • 8.3 分析
    • 8.4 实现
  • 9. 排名 练习二
    • 9.1 需求:
    • 9.2 分析
    • 9.3 实现

1. 窗口函数概述

1.1 介绍

Mysql8.0新增窗口函数,窗口函数又被称为开窗函数,与Oracle窗口函数类似,属于Mysql的一大特点。非聚合窗口函数是相对于聚合函数来说的。聚合函数是对一组数据计算后返回单个值(即分组),非聚合函数一次只会处理一行数据。窗口聚合函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变函数。
在这里插入图片描述

1.2 作用

  • 查询每一行数据时,使用指定的窗口函数对每行关联的一组数据进行处理。
    在这里插入图片描述
  • 简单
    • 窗口函数更易于使用。
    • 之前需要通过定义临时变量和大量的子查询或关联才能完成的工作,使用窗口函数实现起来更加简洁高效。窗口函数也是面试及实际工作的高频点。
  • 快速
    • 使用窗口函数比使用替代方法要快得多。当你处理成百上千个千兆字节的数据时,这非常有用。
  • 多功能性
    • 最重要的是,窗口函数具有多种功能,比如:求差值求占比求排名累计值计算等等。

2. 场景说明

2.1 准备工作

-- 创建表格
CREATE TABLE score (id INT PRIMARY KEY,name VARCHAR(50),gender CHAR(1),score INT
);-- 插入数据
INSERT INTO score (id, name, gender, score) VALUES
(1, '贾宝玉', '男', 85),
(2, '林黛玉', '女', 90),
(3, '薛宝钗', '女', 78),
(4, '王熙凤', '女', 92),
(5, '史湘云', '女', 88),
(6, '贾琏', '男', 86),
(7, '贾环', '男', 87);

2.2 场景说明

需求:计算每个学生的分数和整体平均值的差值。
在这里插入图片描述
在这里插入图片描述

2.3 分析

第一步:求出平均分
第二步:差值=成绩-平均分
在这里插入图片描述

2.4 实现

2.4.1 非窗口函数方式实现

select id, name, gender, score,round((select avg(score) from score),1) as `平均分`,score - (round((select avg(score) from score),1)) as `差值`
from score;

2.4.2 窗口函数方式实现

select id, name, gender, score,round(avg(score) over(),1) as `平均分`,round(score - (avg(score) over()),1) as `差值`
from score;

3. 窗口函数分类

在这里插入图片描述
另外还有开窗聚合函数:SUMAVGMINMAX

4. 窗口函数基础用法:OVER关键字

4.1 语法

select字段,... ...,<window_function> over(... ...)
from;
  • OVER(...)的作用就是设置每一行数据关联的一组数据范围,OVER()时,每行关联的数据范围都是整张表的数据。
  • <window function>表示使用的窗口函数,窗口函数可以使用之前已经学过的聚合函数,比如COUNT、SUM、AVG等,也可以是其他函数,比如 ranking 排序函数等。

4.2 场景一 :计算每个值和整体平均值的差值

4.2.1 需求

在这里插入图片描述

4.2.2 分析

在这里插入图片描述

4.2.3 实现

select id, name, gender, score,round(avg(score) over(),1) as `平均分`,round(score - (avg(score) over()),1) as `差值`
from score;

4.3 场景二: 计算每个值占整体之和的占比

4.3.1 需求

在这里插入图片描述

4.3.2 分析

在这里插入图片描述

4.3.3 非窗口函数实现

selectid, name, gender, score,(select sum(score) from score) as sum_score,round(100 * score / (select sum(score) from score),1) as rate
from score;

4.3.4 窗口函数实现

selectid, name,gender, score,sum(score) over() as sum_score,round(100 * score / (sum(score) over()),1) as rate
from score;

5. PARTITION BY分区

5.1 场景说明

  • 如何计算每个学生的Score 分数同性别学生平均分的差值?
    在这里插入图片描述

5.2 语法

  • partition by 作用:用于对整张表的数据进行分区(分组)操作。
select字段,... ...,<window_function> over(partition by 字段 ...)
from;
  • PARTITION BY 列名, ... 的作用是按照指定列的值对整张表的数据进行分区,OVER()中没有PARTITION BY时,整张表就是一个分区。
  • 分区之后,在处理每行数据时,<window function>是作用在该行数据关联的分区上,不再是整张表。

5.3 分析

第一步:求出平均分(按性别分组求)
在这里插入图片描述
第二步:求出每个人的分数与平均分的差值
在这里插入图片描述

5.4 非窗口函数实现

selectid, name,gender, score,round((select avg(b.score) from score b where b.gender=a.gender),1) as avg_score,round(score - (select avg(b.score) from score b where b.gender=a.gender),1) as diff
from score a;

5.5 窗口函数实现

selectid, name,gender, score,round(avg(score) over(partition by gender),1) as avg_score,round(score-(avg(score) over(partition by gender)),1) as rate
from score ;

5.6 GROUP BY 与 PARTITION BY的区别

  • 使用场景不同
    • GROUP BY分组是为了聚合,分组聚合属于:多进一出
    • PARTITION BY分区是为了配合窗口函数做运算,窗口函数属于:一进一出
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

6. 排名函数:产生排名

6.1 场景说明

在这里插入图片描述

6.2 准备工作

-- 创建学生成绩表
create table student_scores (studentname varchar(50) not null,subject varchar(50) not null,score int not null,primary key (studentname, subject)
);-- 插入张三的成绩数据
insert into student_scores (studentname, subject, score) values ('张三', '语文', 81);
insert into student_scores (studentname, subject, score) values ('张三', '数学', 75);-- 插入李四的成绩数据
insert into student_scores (studentname, subject, score) values ('李四', '语文', 76);
insert into student_scores (studentname, subject, score) values ('李四', '数学', 90);-- 插入王五的成绩数据
insert into student_scores (studentname, subject, score) values ('王五', '语文', 81);
insert into student_scores (studentname, subject, score) values ('王五', '数学', 100);

6.3 语法

  • 排名函数作用:用于按照指定列对每一行产生一个所在分区内的排名序号。
select字段,... ...,<排名函数> over(order by 字段 ...)
from;
  • OVER() 中可以指定 ORDER BY 按照指定列对每个分区内的数据进行排序。
  • 排名函数用于对分区内的每行数据产生一个排名序号。
    • RANKDENSE_RANKROW_NUMBER

6.3 分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.4 实现

6.4.1 非窗口函数方式实现

-- 传统方式 排名 并列 且 排名连续
selectstudentname, subject, score,(select count(distinct score) from student_scores b where b.score>a.score) + 1 as `排名`
from student_scores a
order by score desc;

在这里插入图片描述

6.4.2 窗口函数方式实现

6.4.2.1 rank
-- 排名并列 但 排名不连续
select studentname,subject,score,rank() over (order by score desc) as `排名`
from student_scores;

在这里插入图片描述

6.4.2.2 dense_rank
-- 排名并列 且 排名连续
select studentname,subject,score,dense_rank() over (order by score desc) as `排名`
from student_scores;

在这里插入图片描述

6.4.2.3 row_number
-- 排名连续 但 不考虑排名并列
select studentname,subject,score,row_number() over (order by score desc) as `排名`
from student_scores;

在这里插入图片描述

6.4.2.4 总结
  • RANK():有并列的情况出现时序号会重复但不连续
  • DENSE_RANK():有并列的情况时序号会重复但连续
  • ROW_NUMBER():返回连续唯一的行号,序号不会重复且连续
    在这里插入图片描述

7. PARTITION BY和排名函数

  • 规律: 只要碰到每个每种等类似词汇, 肯定分组
    • group by : 多进一出
    • partition by : 一进一出

    7.1 场景说明

    • 先分组, 再排名
      在这里插入图片描述

7.2 分析

在这里插入图片描述

7.3 实现

7.3.1 非窗口函数实现

selectstudentname,subject, score,(select count(*) + 1 from student_scores b where b.subject=a.subject and b.score>a.score) as `排名`
from student_scores a
order by subject,`排名`;

在这里插入图片描述

7.3.2 窗口函数实现

selectstudentname, subject, score,rank() over (partition by subject order by score desc) as `排名`
from student_scores;

在这里插入图片描述

8. 排名 练习一

8.1 准备工作

-- 创建一个名为 Students 的表,增加区域列
create table Students (id int primary key auto_increment,  -- 学生ID,自动递增name varchar(50),                    -- 学生姓名score int,                           -- 学生成绩region varchar(10)                   -- 学生区域(魏、蜀、吴)
);-- 向 Students 表中插入数据,使用三国人物作为姓名及区域
insert into Students (name, score, region) values
-- 魏国人物
('曹操', 95, '魏'),
('司马懿', 89, '魏'),
('荀彧', 84, '魏'),
('甄氏', 91, '魏'),
('夏侯惇', 88, '魏'),
-- 蜀国人物
('刘备', 85, '蜀'),
('关羽', 92, '蜀'),
('张飞', 78, '蜀'),
('诸葛亮', 88, '蜀'),
('黄承儿', 80, '蜀'),
-- 吴国人物
('孙权', 76, '吴'),
('周瑜', 90, '吴'),
('鲁肃', 83, '吴'),
('陆逊', 86, '吴'),
('小乔', 87, '吴');

8.2 需求: 去掉最高分和去掉最低分 求平均分

8.3 分析

在这里插入图片描述
在这里插入图片描述

8.4 实现

with t1 as (select*,row_number() over (order by score asc) rn1,row_number() over (order by score desc) rn2from Students
)
selectround(avg(score), 2) as avg_score
from t1
where t1.rn1>1 and t1.rn2>1

9. 排名 练习二

9.1 需求:

求每个部门 去掉最高分和去掉最低分 求平均分

9.2 分析

在这里插入图片描述
在这里插入图片描述

9.3 实现

-- 需求2: 求每个部门 去掉最高分和去掉最低分 求平均分
with t1 as (select*,row_number() over (partition by region order by score asc) rn1,row_number() over (partition by region order by score desc) rn2from Students
)
selectround(avg(score), 2) as avg_score
from t1
where t1.rn1>1 and t1.rn2>1
group by region;

感谢观看,未完待续…

相关文章:

Mysql-窗口函数一

文章目录 1. 窗口函数概述1.1 介绍1.2 作用 2. 场景说明2.1 准备工作2.2 场景说明2.3 分析2.4 实现2.4.1 非窗口函数方式实现2.4.2 窗口函数方式实现 3. 窗口函数分类4. 窗口函数基础用法&#xff1a;OVER关键字4.1 语法4.2 场景一 :计算每个值和整体平均值的差值4.2.1 需求4.2…...

Python3 爬虫 数据抓包

一、数据抓包 所谓抓包&#xff08;Package Capture&#xff09;&#xff0c;简单来说&#xff0c;就是在网络数据传输的过程中对数据包进行截获、查看、修改或转发的过程。如果把网络上发送与接收的数据包理解为快递包裹&#xff0c;那么在快递运输的过程中查看里面的内容&…...

js强制刷新

在JavaScript中触发强制刷新通常指的是强制浏览器重新加载页面&#xff0c;忽略缓存。以下是几种实现强制刷新的方法&#xff1a; ### 使用 location.reload() 这是最简单的方法&#xff0c;它会重新加载当前页面。 javascript location.reload(true); // 传入true参数表示强制…...

yolov5 part2

two-stage &#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 one-stage &#xff08;单阶段&#xff09;&#xff1a;YOLO系列 最核心的优势&#xff1a;速度非常快&#xff0c;适合实时监测任务。但是缺点也有&#xff0c;效果可能不好 速度较慢在2018…...

Hive3:表操作常用语句-内部表、外部表

一、内部表 1、基本介绍 &#xff08;CREATE TABLE table_name ......&#xff09; 未被external关键字修饰的即是内部表&#xff0c; 即普通表。 内部表又称管理表,内部表数据存储的位置由hive.metastore.warehouse.dir参数决定&#xff08;默认&#xff1a;/user/hive/ware…...

【PXE+kickstart】linux网络服务之自动装机

PXE&#xff1a; 简介&#xff1a;PXE(Preboot execute environment 是一种能够让计算机通过网络启动的引导方式&#xff0c;只要网卡支持PXE协议即可使用Kickstart 是一种无人值守的安装方式&#xff0c;工作原理就是预先把原本需要运维人员手工填写的参数保存成一个 ks.cfg 文…...

vmware ubuntu虚拟机网络联网配置

介绍vmware虚拟机配置基础网络环境&#xff0c;同时连接外网&#xff08;通过桥接模式&#xff09;&#xff0c;以及ubuntu下输入法等基础工具安装。 本文基于ubuntu22.04&#xff0c;前提虚拟机已经完成安装。本文更多是针对vmware虚拟机的设置&#xff0c;之前有一篇针对ubun…...

Vue3_对接声网实时音视频_多人视频会议

目录 一、声网 1.注册账号 2.新建项目 二、实时音视频集成 1.声网CDN集成 2.iframe嵌入html 3.自定义UI集成 4.提高进入房间速度 web项目需要实现一个多人会议&#xff0c;对接的声网的灵动课堂。在这里说一下对接流程。 一、声网 声网成立于2014年&#xff0c;是全球…...

慧灵科技:创新引领自动化未来

在智能制造与自动化生产日益成为主流趋势的今天&#xff0c;慧灵科技凭借其卓越的技术创新能力和产品优势&#xff0c;在机器人领域崭露头角。 自2015年在深圳成立以来&#xff0c;慧灵科技专注于核心技术的研发与产品创新&#xff0c;‌为各行业提供性价比极高的机器人产品及自…...

【TiDB 社区智慧合集】TiDB 在核心场景的实战应用

作者&#xff1a; 社区小助手 原文来源&#xff1a; https://tidb.net/blog/5cc4ec70 杭州银行 杭州银行采用 TiDB 作为其核心系统数据库&#xff0c;标志着银行资产规模和业务复杂性的大幅增长。通过"分布式透明化"的思考&#xff0c;杭州银行实现了从传统 Orac…...

JetBrains:XML tag has empty body警告

在xml文件中配置时&#xff0c;因为标签内容为空&#xff0c;出现黄色警告影响观感。 通过IDE配置关闭告警...

XMLDecoder反序列化

XMLDecoder反序列化 基础知识 就简单讲讲吧&#xff0c;就是为了解析xml内容的 一般我们的xml都是标签属性这样的写法 比如person对象以xml的形式存储在文件中 在decode反序列化方法后&#xff0c;控制台成功打印出反序列化的对象。 就是可以根据我们的标签识别是什么成分…...

C# 高级数据处理:深入解析数据分区 Join 与 GroupJoin 操作的应用与实例演示

文章目录 一、概述二. 数据分区 (Partitioning)三、Join 操作符1. Join 操作符的基本用法2. Join 操作符示例 四、GroupJoin 操作符1. GroupJoin 操作符的基本用法2. GroupJoin 操作符示例 总结 在数据处理中&#xff0c;联接&#xff08;Join&#xff09;操作是一种非常常见的…...

数据库典型例题2-ER图转换关系模型

1.question solution: 2.做题步骤 一些解释&#xff1a; <1弱实体把强属性的主键写进去&#xff0c;指向强属性。eg:E6_A13指向E5_A13 <21:1&#xff0c;1:n&#xff0c;m:n&#xff1a;将完全参与的一方&#xff08;双线&#xff09;指向另一方&#xff0c;并将对方的…...

Java:设计模式(单例,工厂,代理,命令,桥接,观察者)

模式是一条由三部分组成的通用规则&#xff1a;它代表了一个特定环境、一类问题和一个解决方案之间的关系。每一个模式描述了一个不断重复发生的问题&#xff0c;以及该问题解决方案的核心设计。 软件领域的设计模式定义&#xff1a;设计模式是对处于特定环境下&#xff0c;经常…...

【算法】KMP算法

应用场景 有一个字符串 str1 "BBA ABCA ABCDAB ABCDABD"&#xff0c;和一个子串 str2 "ABCDABD"现在要判断 str1 是否含有 str2&#xff0c;如果含有&#xff0c;就返回第一次出现的位置&#xff0c;如果不含有&#xff0c;则返回 -1 我们很容易想到暴力…...

nginx续1:

八、虚拟主机配置 基于域名的虚拟主机 [rootserver2 ~]# ps -au|grep nginx //查看进程 修改Nginx服务配置&#xff0c;添加相关虚拟主机配置如下 1. [rootproxy ~]# vim /usr/local/nginx/conf/nginx.conf 2. .. .. 3. server { 4. listen …...

循环队列和阻塞有什么关系?和生产者消费者模型又有什么关系?阻塞队列和异步日志又有什么关系

### 循环队列和阻塞队列 #### 循环队列 - **定义**: 一个固定大小的数组&#xff0c;通过两个指针&#xff08;front 和 back&#xff09;管理队列的头部和尾部元素。 - **特点**: - **循环性**: 当指针到达数组的末尾时&#xff0c;可以回绕到数组的开头&#xff0c;从而利…...

物理笔记-八年级上册

0.梦开始的地方 物理研究什么&#xff1f; 电学&#xff0c;力学&#xff0c;声学&#xff0c;光学&#xff0c;热学。 1.1.1长度的单位 国际基本单位制 单位转换 魔法记忆&#xff1a;千米-米-毫米-微米-纳米&#xff08;进率都是1000&#xff09; 单位换算计算方法 用科学…...

QT键盘和鼠标事件

这些事件都在QWidget 中的保护成员方法中 都是虚函数在头文件中声明了 需要类外重现实现 如果头文件中声明 类外无实现就会报错 void Widget::keyPressEvent(QKeyEvent *event) {switch (event->key()) {//获取按键case Qt::Key_W://按键wqDebug()<<"按下w"…...

文件Io编程基础

1. 标准I/O (stdio.h) stdio.h 是标准C库的头文件&#xff0c;包含了输入输出函数的声明。位置&#xff1a;/usr/include/stdio.h 2. 文件I/O操作步骤 打开文件: 使用 fopen 函数&#xff0c;返回 FILE* 指针。读/写操作: 使用 fread、fwrite、fgets、fputs、fprintf、fscan…...

本地项目提交到Gitee

在项目目录 右键 git bash here 可以在黑屏输入命令 也可以在项目里面 命令都是一样的 要排除哪些 git add . 添加所有文件 git commit -m "Initial commit" 提交到本地 git remote add origin https://gitee.com/xxxx/xxxx.git 添加远程仓库 …...

有了谷歌账号在登录游戏或者新APP、新设备时,要求在手机上点击通知和数字,怎么办?

有的朋友可能遇到过&#xff0c;自己注册或购买了谷歌账号以后&#xff0c;在自己的手机上可以正常登录&#xff0c;也完成了相关的设置&#xff0c;看起来一切都很完美&#xff0c;可以愉快地玩耍了。 但是&#xff0c;随后要登录一个游戏的时候&#xff08;或者登录一个新的…...

rsyslog如何配置日志轮转

以下是在 Linux 系统中配置 rsyslog 日志轮转策略的一般步骤&#xff1a; 编辑 rsyslog 的配置文件&#xff0c;通常为 /etc/rsyslog.conf 或 /etc/rsyslog.d/*.conf 。 在配置文件中添加类似以下的日志轮转配置示例&#xff1a; $template myLogs,"/var/log/mylog-%Y%m%d…...

LLM推理入门实践:基于 Hugging Face Transformers 和 Qwen2模型 进行文本问答

文章目录 1. HuggingFace模型下载2. 模型推理&#xff1a;文本问答 1. HuggingFace模型下载 模型在 HuggingFace 下载&#xff0c;如果下载速度太慢&#xff0c;可以在 HuggingFace镜像网站 或 ModelScope 进行下载。 使用HuggingFace的下载命令&#xff08;需要先注册Huggin…...

python:YOLO格式数据集图片和标注信息查看器

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何实现一个可视化图片和标签信息的查看器&#xff0c;代码使用python实现。点击下一张和上一张可以切换图片。 文章目录 一、脚本界面二、完整代码 一、脚本界面 界面如下图所示&#xff0c; 二、完整代码 使用代码时&#xff0…...

AGI思考探究的意义、价值与乐趣 Ⅴ

搞清楚模型对知识或模式的学习与迁移对于泛化意味什么&#xff0c;或者说两者间的本质&#xff1f;相信大家对泛化性作为大语言模型LLM的突出能力已经非常了解了 - 这也是当前LLM体现出令人惊叹的通用与涌现能力的基础前提&#xff0c;这里不再过多赘述&#xff0c;但仍希望大家…...

c++: mangle命名规则

其实可用根据binutils/c++filt的源代码看。找到mangle的命名规则, 但是从网上找到了一个总结,但是github有时候上不去,摘录再次。 https://github.com/gchatelet/gcc_cpp_mangling_documentation https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling 举例: _ZN8…...

系统化学习 H264视频编码(05)码流数据及相关概念解读

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…...

【VMware】如何演示使用U盘在VMware虚拟机上安装Windows11

一、前置准备 在开始使用U盘演示在VMware虚拟机上装Windows11前&#xff0c;我们需要做以下前置的准备&#xff1a; 已制作好的Windows引导盘&#xff1b;WMware软件 如何制作Windows引导盘&#xff1f; 推荐参考&#xff1a; 【建议收藏】2024年最新Windows系统重装教程&…...