mysql-窗口函数一

目录

一、感受一下分组与窗口函数的区别

二、滑动窗口(子窗口)大小的确认

2.1 分组函数下order by使用

 2.2 窗口子句

2.3 执行流程

三、函数使用

窗口函数需要mysql的版本大于等于8才行,可以先检查一下自己的mysql版本是多少

select version();

准备一下表数据

drop table if exists student;
create table student
(cid    varchar(50),sname  varchar(50),course varchar(50),score  int
) character set utf8mb4;-- 插入两个班级的学生数据(每个学生包含4门课程成绩)
INSERT INTO student (cid, sname, course, score)
VALUES
-- 班级01
('01', '张三', '语文', 85),
('01', '张三', '数学', 92),
('01', '张三', '英语', 78),
('01', '张三', '物理', 88), 
('01', '李四', '语文', 76),
('01', '李四', '数学', 88),
('01', '李四', '英语', 95),
('01', '李四', '化学', 90), 
('01', '王五', '语文', 65),
('01', '王五', '数学', 73),
('01', '王五', '英语', 82),
('01', '王五', '生物', 77), -- 班级02
('02', '赵六', '语文', 90),
('02', '赵六', '数学', 67),
('02', '赵六', '英语', 88),
('02', '赵六', '地理', 85), 
('02', '陈七', '语文', 72),
('02', '陈七', '数学', 85),
('02', '陈七', '英语', 91),
('02', '陈七', '历史', 89), 
('02', '周八', '语文', 68),
('02', '周八', '数学', 79),
('02', '周八', '英语', 84),
('02', '周八', '政治', 83); 

一、感受一下分组与窗口函数的区别

假设现在有一个需求需要统计每个学生的各科总成绩,我们分别使用分组group by 和窗口函数 partition by 来试一下

先来看看group by

select cid, sname, sum(score)
from student
group by sname;

 这里是以每个学生的名字来分组的,显然这里只有六个学生,那么就只会有六行数据

接下来我们看看 partition by的使用

select *,sum(score) over (partition by sname)
from student;

从行来看:可以很明显的感受到,分组group by是先分组在把数据进行压缩,但是窗口函数是保留了并没有对行数进行压缩

从列来看:也是发现一个mysql5.7和mysql8的区别,因为我本机是5.7,在云服务器上面用了mysql8,今天惊奇的发现mysql8,不是分组列,不能被展示,意思就是我只能展示两列,一列是sname(分组列),聚合函数一列

也就是说group by生成的表与原有的表行数和列数都不相同

 

二、滑动窗口(子窗口)大小的确认

2.1 分组函数下order by使用

先说结论,排序只会在当前窗口内进行排序

假设现在有一个需求,需要查询每个同学的各科成绩为降序排列

select sname, course, score, 
row_number() over (partition by sname order by score desc)
from student;

 2.2 窗口子句

窗口子句:控制每一行在可以滑动的子窗口的窗口的大小
起始行:N preceding/unbounded preceding
当前行:current row
终止行:N followding/unbounded preceding

举例:rows between 上边界 and 下边界

#从之前的所有行到当前行
rows between unbounded preceding and current row
#从前面的两行到当前行
rows between 2 preceding and current row
#从当前的所有行到之后的所有行
rows between current row and unbounded following
#从当前行到后面一行
rows between current row and 1 following

注意:

如果排序子句后面缺少窗口子句: 窗口规范默认是:#从之前的所有行到当前行

rows between unbounded preceding and current row

排序子句和窗口子句都缺少:窗口规范就是:分组的窗口大小

rows between unbounded preceding and unbounded following

2.3 执行流程

  1. 先通过partition by 和order by 定义整个分组的大窗口
  2. 通过orws 子句来定义每一行数据的滑动窗口
  3. 对每行的小窗口内的数据执行并生成新的列

三、函数使用

3.1 排序类

在 SQL 中,rank(),dense_rank(),row_number 是窗口函数,它们的 ​​排序依据​​ 完全由 over子句中的 order by 字段决定的!!!

函数重复值处理逻辑示例(分数为 90 的两人)
​ROW_NUMBER()​为每行分配唯一序号,即使值相同也按顺序编号。90 → 1, 90 → 2
​RANK()​相同值分配相同排名,后续排名跳跃。90 → 1, 90 → 1 → 下一行为 3
​DENSE_RANK()​相同值分配相同排名,后续排名连续。90 → 1, 90 → 1 → 下一行为 2

3.2 聚合类

3.3 跨行类

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

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

相关文章

解决在Mac上无法使用“ll”命令

在 macOS 上,ll 命令是一个常见的别名,它通常是指向 ls -l 的。但是,如果你看到 zsh: command not found: ll,这意味着你当前的 zsh 配置中没有设置 ll 作为别名。 解决方法: 1. 使用 ls -l 命令 如果只是想查看目录…

GTA5(传承/增强) 13980+真车 超跑 大型载具MOD整合包+最新GTA6大型地图MOD 5月最新更新

1500超跑载具 1000普通超跑 1500真车超跑 各种军载具1000 各种普通跑车 船舶 飞机 1000 人物1500 添加式led载具1000 超级英雄最新版 添加添加式武器MOD1000 添加地图MOD500 添加超跑载具2000 当前共计1.2wMOD 4月2日更新 新增770menyoo地图 当前共计12770 新增48款超级英雄最新…

初学Vue之记事本案例

初学Vue之记事本案例 案例功能需求相关Vue知识案例实现1.实现方法及代码2.演示 案例收获与总结 案例功能需求 基于Vue实现记事功能(不通过原生JS实现) 1.点击保存按钮将文本框的内容显示在特定位置,且清空文本框内容 2.点击清空按钮&#x…

一个linux系统电脑,一个windows电脑,怎么实现某一个文件夹共享

下载Samba linux主机名字不能超过15个字符 sudo dnf install samba samba-client -y 创建共享文件夹 sudo mkdir /shared 配置文件 vim /etc/samba/smb.conf [shared] path /shared available yes valid users linux电脑用户 read only no browsable yes p…

树莓派5+edge-tts 语音合成并进行播放测试

简介 Edge-TTS 是一个基于微软 Edge 浏览器的开源文本转语音(TTS)工具,主要用于将文本转换为自然流畅的语音。它利用了微软 Azure 的 TTS 技术,支持多种语言和声音,同时具备高质量的语音合成能力。这里简单演示在树莓派中安装该项目进行简单测试。 开源仓库地址:https:/…

多模态革命!拆解夸克AI相机技术架构:如何用视觉搜索重构信息交互?(附开源方案对比)

一、技术人必看:视觉搜索背后的多模态架构设计 夸克「拍照问夸克」功能绝非简单的OCRQA拼接,而是一套多模态感知-推理-生成全链路系统,其技术栈值得开发者深挖: 视觉编码器:基于Swin Transformer V2,支持4…

论文阅读:2024 ICLR Workshop. A STRONGREJECT for Empty Jailbreaks

总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 A STRONGREJECT for Empty Jailbreaks 对空越狱的 StrongREJECT https://arxiv.org/pdf/2402.10260 https://github.com/dsbowen/strong_reject https://strong-reject.re…

AI生成Flutter UI代码实践(一)

之前的杂谈中有提到目前的一些主流AI编程工具,比如Cursor,Copilot,Trea等。因为我是Android 开发,日常使用Android Studio,所以日常使用最多的还是Copilot,毕竟Github月月送我会员,白嫖还是挺香…

计网分层体系结构(包括OSI,IP,两者对比和相关概念)

众所周知,就像我们计算机领域中的任何东西一样,计算机网络也是个分层的体系结构,现代提出的结构就两种——OSI和TCP/IP,我们先来剖析并对比一下这两种模型,然后总结一下分层思想中的一些共性。 TCP/IP与OSI结构对比图 …

面向对象的XML综合练习

快递包裹配送管理 需求描述 构建一个快递包裹配送管理系统,完成以下操作: 记录每个快递包裹的信息,包括包裹编号、收件人姓名、收件地址和是否已配送。可以添加新的快递包裹到系统中。标记某个包裹为已配送状态。统计所有已配送和未配送的…

什么是鸿蒙南向开发?什么是北向开发?

文章目录 鸿蒙南向开发 vs 北向开发:底层与生态的双向赋能一、鸿蒙南向开发:连接硬件的底层基石二、鸿蒙北向开发:构建全场景应用生态三、南向与北向:互补与协同四、如何选择开发方向?结语 鸿蒙南向开发 vs 北向开发:…

Linux常用命令27——userdel删除用户

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,userdel命令来自英文词组user delete的缩写,其功能是删除用户信息。在Linux系统中,一切都是文件,用户信息被保存到了/etc/passwd、/etc/shadow以及…

[蓝桥杯 2021 省 AB] 砝码称重 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] w new int[n 1];int sum 0; // 所有砝码重量之和for (int i 1; i < n; i) {w[i] sc.nextInt();sum w[i];}sc.close()…

今天的python练习题

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 晚上8点到的&#xff0c;还是会被感动到&#xff0c;有一位列车员同志在检票期间&#xff0c;叫我到列车员专座位上去坐&#xff0c;我很感激他&#xff0c;温暖人心&#xff0c;所以人间填我…

20250430在ubuntu14.04.6系统上查看系统实时网速

rootrootubuntu:~$ sudo apt-get install iftop 【不需要root权限】 rootrootubuntu:~$ sudo apt-get install nload rootrootubuntu:~$ sudo apt-get install vnstat 【失败】 rootrootubuntu:~$ sudo apt-get install speedtest-cli rootrootubuntu:~$ sudo apt-get install …

字节一面:后端开发

前言 这是我字节一面的回忆录&#xff0c;可能有些不全。 由于博主是Java面试Go岗&#xff0c;操作系统和计网问的还是比较多。 个人感觉字节很喜欢追问&#xff0c;博主被追问拷打的找不到北了&#xff0c;总结还是学的太浅了。 面试官给我的建议&#xff1a;再更深挖一些…

快速掌握大语言模型+向量数据库_RAG实现

一、前言 结合前面掌握的vLLM部署Qwen7B模型、通过Embedding模型&#xff08;bdg-large-zh模型&#xff09;提取高质量作文内容并预先存储到Milvus向量数据库中&#xff0c;我们很容易实现RAG方案进一步提高写作内容的生成质量。 本篇要实现的目标是&#xff1a;通过FlaskAPI…

【FreeRTOS-列表和列表项】

参照正点原子以及以下gitee笔记整理本博客&#xff0c;并将实验结果附在文末。 https://gitee.com/xrbin/FreeRTOS_learning/tree/master 一、列表和列表项的简介(熟悉) 1、什么是列表 答&#xff1a;列表是FreeRTOS中的一个数据结构&#xff0c;概念上和链表有点类似&#…

【c++】【STL】queue详解

目录 queue的作用什么是容器适配器queue的接口构造函数emptysizefrontback queue类的实现 queue的作用 queue是stl库提供的一种容器适配器&#xff0c;也就是我们数据结构中学到的队列&#xff0c;是非常常用的数据结构&#xff0c;特点是遵循LILO&#xff08;last in last ou…