Mysql-窗口函数一

news2025/1/13 10:07:16

文章目录

  • 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 非窗口函数实现

select
    id, 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 窗口函数实现

select
    id, 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 非窗口函数实现

select
    id, 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 窗口函数实现

select
    id, 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 非窗口函数方式实现

-- 传统方式 排名 并列 且 排名连续
select
    studentname, 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 非窗口函数实现

select
    studentname,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 窗口函数实现

select
    studentname, 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) rn2
    from Students
)
select
    round(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) rn2
    from Students
)
select
    round(avg(score), 2) as avg_score
from t1
where t1.rn1>1 and t1.rn2>1
group by region;

感谢观看,未完待续…

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

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

相关文章

免费的远程办公软件

产生背景 我们的SD-WAN组网的产品一直都是以CPE盒子的形式进行交付&#xff0c;如果您有多个企业分支&#xff0c;那么需要在每个分支安装一个CPE盒子。 这种形式存在一些问题&#xff1a; 成本过高&#xff0c;CPE盒子本身是有成本的&#xff0c;没办法做到免费使用&#xf…

用Maven构建项目和管理依赖

运行本篇中的代码&#xff1a;idea专业版或者idea社区版本&#xff08;2021.1~2022.1.4&#xff09; 用Maven构建项目和管理依赖 1. 初见maven2. maven在网站项目中的应用3. maven和idea的关系4. maven的使用4.1 项目构建4.11 在idea创建maven项目4.12 利用maven命令打包项目 4…

“QtGraphicalEffects“ is not installed

【1】问题&#xff1a;qml项目报 module "QtGraphicalEffects" is not installed 【2】解决方法&#xff1a;将qml目录中的"QtGraphicalEffects" 拷贝到工程release目录

3种 Ajax 方式:原生、jQuery、axios

毋庸多言&#xff0c;Ajax 技术在网页中是划时代的进步。学会它&#xff0c;可以说掌握了一招半式&#xff0c;不再是门外汉了。 这里将 3 种 Ajax 方式一并呈上。 感谢 https://run.uv.cc/ 平台&#xff0c;以及 /api 接口 https://andi.cn/page/621639.html https://andi…

用Java手写jvm之模拟类加载器加载class

写在前面 本文来尝试模拟类加载器加载class的过程。 1&#xff1a;程序 首先来定义类加载器类&#xff1a; /*** 类加载器* 正常应该有bootstrap&#xff0c;ext&#xff0c;app三个类加载器&#xff0c;这里简单起见&#xff0c;只用一个来模拟了*/ public class ClassLoa…

入门 PyQt6 看过来(案例)20~ 动态树

​ 1 QTreeWidget树类 QTreeWidget类可以呈现数组、数列等数据&#xff0c;并且可以进行交互&#xff0c;它使用标准的数据模型&#xff0c;其单元格数据通过QTableWidgetItem对象来实现。 QTreeWidget继承自QTreeView&#xff0c;是封装了默认Model的QTreeView&#xff0c;其…

C++ | Leetcode C++题解之第312题戳气球

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxCoins(vector<int>& nums) {int n nums.size();vector<vector<int>> rec(n 2, vector<int>(n 2));vector<int> val(n 2);val[0] val[n 1] 1;for (int i 1; i &l…

ElasticSearch入门(六)SpringBoot2

private String author; Field(name “word_count”, type FieldType.Integer) private Integer wordCount; /** Jackson日期时间序列化问题&#xff1a; Cannot deserialize value of type java.time.LocalDateTime from String “2020-06-04 15:07:54”: Failed to des…

Django文件上传

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 本节主要介…

【计算机网络】IP地址和子网掩码(子网掩码篇)

个人主页:【😊个人主页】 系列专栏:【❤️计算机网络】 文章目录 前言什么是子网掩码?子网掩码的组成组成规则表示方法子网掩码的分类标准(默认)子网掩码:变长子网掩码(VLSM):全零和全一子网掩码:子网掩码的计算确定IP地址类别及默认子网掩码计算子网掩码根据子网数…

橙单中台化低代码生成器

​橙单中台化低代码生成器 在当今快速发展的软件开发领域&#xff0c;橙单中台化低代码生成器凭借其强大的功能和灵活的架构&#xff0c;成为了开发者不可或缺的利器。本文将介绍橙单的基本信息、特点以及如何快速部署和使用。 软件简介 橙单中台化低代码生成器是一款开源的低…

被华为的AI扩图震惊到,超自然超好看!

美颜、P图对大家来说都不陌生&#xff0c;但是近期在互联网实火的各种AI扩图你了解多少&#xff1f;它既能满足图片构图时进行延伸美化&#xff0c;又能在未知的创意里无限探索。 近期&#xff0c;华为Pura 70系列手机获推HarmonyOS 4.2.0.172 更新&#xff0c;华为Pura 70 Pr…

事务性邮件API的功能优势?考虑哪些指标?

事务性邮件API的性能如何优化&#xff1f;怎么选择邮件API接口&#xff1f; 在当今数字化时代&#xff0c;企业需要一种高效、可靠的方法与客户沟通。事务性邮件API成为解决这一需求的重要工具。AokSend将探讨事务性邮件API的功能优势及考虑的关键指标。 事务性邮件API&#…

如何在 Kubernetes 中使用 ClickHouse 和 JuiceFS

ClickHouse 结合 JuiceFS 一直是一个热门的组合&#xff0c;社区中有多篇实践案例。今天的文章来自美国公司 Altinity&#xff0c;一家提供 ClickHouse 商业服务的企业&#xff0c;作者是 Vitaliy Zakaznikov&#xff0c;他尝试了这个组合并公开了过程中使用的代码。原文有两篇…

基于DreamBooth的“妙鸭相机”——一次不太成功的实践

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

Encoder-Decoder:Seq2seq

目录 一、编码器解码器架构&#xff1a;1.定义&#xff1a;2.在CNN中的体现&#xff1a;3.在RNN中的体现&#xff1a;4.代码&#xff1a; 二、Seq2seq&#xff1a;1.模型架构&#xff1a;1.1编码器&#xff1a;1.2解码器&#xff1a; 2.架构细节&#xff1a;3.模型评估指标BLEU…

C# Unity 补全计划 泛型

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 1.什么是泛型 泛型&#xff08;Generics&#xff09;是C#中的一个强大特性&#xff0c;允许你编写可以适用于多种数据类型的可重用代码&#xff0c;而不需要重复编写…

第二证券:刚刚!亚太股市,跌麻了!

今天早盘&#xff0c;亚太股市全线崩跌。日经225指数在大幅低开之后快速下行&#xff0c;最大跌幅近5%&#xff1b;韩国、澳大利亚股指亦迎来逾越2%以上的暴降。那么&#xff0c;毕竟发生了什么&#xff1f; 剖析人士认为&#xff0c;或许仍是与日元套息有关。从前史来看&…

Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules。Android studio纯java代码报错

我使用java代码 构建项目&#xff0c;初始代码运行就会报错。我使用的是Android Studio Giraffe&#xff08;Adroid-studio-2022.3.1.18-windows&#xff09;。我在网上找的解决办法是删除重复的类&#xff0c;但这操作起来真的太麻烦了。 这是全部报错代码&#xff1a; Dupli…

mysql环境的部署安装及数据库的操作(twenty day)

一、centos7 中安装 mysql 8.x 1、下载安装包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2、解压 tar -zxvf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3、卸载mariodb yum remove -y *mariadb* 4、依次安装依赖包…