MySQL8 窗口函数 →_→ 专治GROUP BY后组内元素

news2025/1/17 6:01:36

前言

假设你有一张表,里面记录了各个城市的销售数据,包括城市、销售日期和销售额。你可能会使用GROUP BY来按城市对数据进行分组,这样就可以知道每个城市的总销售额了。但是,有时候你可能还会希望对每个城市的销售数据进行更细致的分析。比如,你想知道每个城市中每天销售额最高的记录是哪条,那么直接来个Max()函数就可以实现,但是你想计算每个城市的销售额占整个组的比例,就需要将处理的细度细分到组内的元素,这里就需要用到窗口函数啦

窗口函数介绍

基础概念

MySQL 8.0 新增窗口函数,窗口函数又被称为开窗函数,与oracle 窗口函数类似,属于MysQL的一大特点

窗口函数可以让你在GROUP BY之后对每个组内的数据进行特定的操作,而不仅仅是简单地进行分组求和或者平均值计算。

image.png

分类

image.png

语法结构

image.png

函数详解

序号函数

  • 函数可以用来实现分组排序,并添加序号

    • ROW_NUMBER(): 对组内元素进行添加编号,根据排序字段从1开始编号,同数量下无并列号情况
    • RANK(): 对组内元素进行添加编号,根据排序字段从1开始编号,同数量下有并列号情况,自动跳过并列号原始序号
    • DENSE_RANK(): 对组内元素进行添加编号,根据排序字段从1开始编号,同数量下有并列号情况,不跳过并列号原始序号
  • 语法格式

ROW_NUMBER() | RANK() | DENSE_RANK() OVER(
    PARTITION BY .... # 选填,分组字段,不加则表示全局排序
    ORDER BY ... # 必填,排序字段
) # 结果是作为一个字段进行返回
  • 案例演示

image.png

image.png

  • 使用注意

    • 对于序号函数的结果字段无法通过WHERE来进行过滤,因为SQL的执行是先执行FROM,再执行WHERE,最后才会执行SELECT,所以在WHERE中无法获得SELECT中的序号函数的结果字段来进行过滤。因此我们只能通过子查询来进行过滤

image.png


开窗聚合函数

注意噢,这里是针对组内的每一条数据以及其上方的数据进行一个再细分的分组计算,这比我们传统的分组聚合函数粒度更加细

  • 在组内进行集合计算,在窗口中每条记录动态地应用聚合函数 (SUM()、AVG()、MAX()、MIN()、COUNT()),可以动态计算在指定的窗口内的各种聚合函数值。

    • SUM(): 求组内元素总和
    • AVG(): 求组内元素平均值
    • MAX(): 求组内元素最大值
    • MIN(): 求组内元素最小值
    • COUNT(): 求组内元素条数
  • 语法格式

SUM() | AVG() | MAX() | MIN() | COUNT() OVER(
    PARTITION BY .... # 选填,分组字段,不加则表示全局排序
    ORDER BY ... # 必填,排序字段
    ROWS BETWEEN 长度A preceding AND CURRENT ROW # 选填,以当前行向上A行作为计算区间,默认是从组内首行到当前行的区间范围
    ROWS BETWEEN 长度A preceding AND 长度B FOLLOWING # 选填,以当前行向上A行及其当前行向下B行作为计算区间
    ROWS BETWEEN 长度A preceding AND UNBOUNDED FOLLOWING # 选填,以当前行向上A行到组内最后一行作为计算区间
    ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING # 选填,以当前行到组内最后一行作为计算区间
) # 结果是作为一个字段进行返回
  • 案例演示

image.png

image.png


分布函数

CUME_DIST
  • 查找分组内 小于、等于当前数据的排序字段的行数 / 分组内总行数
  • 应用场景: 查询小于等于当前薪资 (salary)的比例
  • 语法格式

image.png

  • 案例演示

image.png

image.png

image.png

PERCENT_RANK(了解)
  • 用途:每行按照公式 (rank-1) / (rows-1) 进行计算。其中,rank为 RANK() 函数产生的序号,rows为当前窗口的记录总行数
  • 语法格式

image.png

  • 案例演示

image.png

image.png


前后函数

  • 用途: 获取组内距离自己前面多少行或者后面多少行的数据放到自己行上,方便进行数值运算

说人话就是把组内其他行的那个排序字段的数据转到自己这行上来了,既然都在一个行上了,那么可以实现数值运算,简而言之就是组内两两数据间的数值运算的效果

  • 应用场景: 查询前1名同学的成绩和当前同学成绩的差值
  • 语法格式

image.png

  • 案例演示

image.png

image.png


头尾函数

  • 用途: 返回组内从首行到当前行这个区间的第一个数据或最后一个数据(这个其实就是本行的数据)
  • 应用场景: 截止到当前,按照日期排序查询第1个入职和最后1个入职员工的薪资
  • 语法格式

image.png

  • 案例演示

image.png

image.png


其他函数

NTH_VALUE
  • 用途: 返回分组区间的首行到当前行的 第n个expr的值。expr可以是表达式,也可以是列名
  • 应用场景: 截止到当前薪资,显示每个员工的薪资中排名第2或者第3的薪资
  • 语法格式

image.png

  • 案例演示

image.png

image.png

NTILE
  • 用途: 将分区中的有序数据分为n个等级,记录等级数
  • 应用场景: 将每个部门员工按照入职日期分成3组
  • 语法格式

image.png

  • 案例演示

image.png

image.png

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

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

相关文章

不可错过的欧几里得几何:探索数学世界的奇迹应用

不可错过的欧几里得几何:探索数学世界的奇迹应用 一、引言二、欧几里得几何的起源与发展三、欧几里得几何的基本概念3.1、点、直线、平面的定义3.2、全等3.3、平行与垂直3.4、角度、三角形、四边形等基本图形的性质 四、欧几里得几何的公理五、欧几里得几何的应用总…

国考省考行测:分析推理,形式逻辑,集合推理,真假推理

国考省考行测:分析推理,形式逻辑 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和…

Kano模型

目录 1.介绍:2.Kano模型的作用:3.KANO模型使用场景:4.使用步骤:4.1设计问卷:4.2 数据分析4.2.1 KANO属性4.2.2 Better系数、Worse系数4.2.3 举例: 小结: 1.介绍: Kano模型是一种质量…

《合成孔径雷达成像算法与实现》Figure5.18

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

【微服务】springboot集成ELK使用详解

目录 一、前言 二、为什么需要ELK 三、ELK介绍 3.1 什么是elk 3.2 elk工作原理 四、ELK环境搭建 4.1 搭建es环境 4.1.1 获取es镜像 4.1.2 启动es容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 4.2 搭建kibana 4.2.1 拉取kibana镜像 4.2.2 启动kibana容器 4.2.3 …

Linux系统明明还有足够的物理内存,调用fork却返回ENOMEM

使用systemtab hook fork,定位到报错调用路径SYSCALL_DEFINE0(fork)-》kernel_clone-》copy_process-》copy_mm-》dup_mm-》dup_mmap-》security_vm_enough_memory_mm-》__vm_enough_memory __vm_enough_memory返回了 -ENOMEM。其源码如下: 从代码可知f…

1 月 27日算法练习-贪心

文章目录 扫地机器人分糖果最小战斗力差距谈判纪念品分组 扫地机器人 思路: 最优机器人清理方法:机器人清理方法先扫左边,有时间再扫右边。最短时间:通过枚举,从 1 开始,清理面积会越大直到全部面积的清理…

测试C#调用OpenCvSharp和IronOcr从摄像头中识别文字

学习了基于OpenCvSharp获取摄像头数据,同时学习了基于IronOcr的文字识别用法,将这两者结合即是从摄像头中识别文字。本文测试C#调用OpenCvSharp和IronOcr从摄像头中识别文字的基本用法、。   新版Winform项目,在Nuget包管理器中添加以下程序…

macOS系统鼠标变彩虹的解决办法(详细)

目录 第一步 打开活动监视器 第二步 找出【简体中文输入方式】这个进程 第三步 点击最上方的"X"按钮,选择"退出" 按钮 第一步 打开活动监视器 如果下方的任务栏没有显示,可以在左下角【启动台】-其他里打开 -- 第二步 找出【…

编曲学习:和声音程 调式体系 唱名法 调式调性

34届和声音程 调式体系 唱名法 调式调性https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65af994be4b064a8cb1c3a5f?course_idcourse_2XLKtQnQx9GrQHac7OPmHD9tqbv 34届独立音乐人编曲训练营https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_p…

Web 鼠标滑过有粒子掉落

最近在写接口&#xff0c;反正环境也有了&#xff0c;无聊写点代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>粒子效果</title><style>body {ma…

Selenium + Django + Echarts 实现亚马逊商品数据可视化爬虫项目

最近完成了1个爬虫项目&#xff0c;记录一下自己的心得。 项目功能简介 根据用户输入商品名称、类别名称&#xff0c;使用Selenium, BS4等技术每天定时抓取亚马逊商品数据&#xff0c;使用Pandas进行数据清洗后保存在MySql数据库中. 使用Django提供用户端功能&#xff0c;显…

架构篇20:高性能负载均衡-分类及架构

文章目录 负载均衡分类1. DNS 负载均衡2. 硬件负载均衡3. 软件负载均衡负载均衡典型架构小结单服务器无论如何优化,无论采用多好的硬件,总会有一个性能天花板,当单服务器的性能无法满足业务需求时,就需要设计高性能集群来提升系统整体的处理性能。 高性能集群的本质很简单…

【JavaScript】ECMA6Script es6

文章目录 一、 es6的介绍二、 es6的变量和模板字符串2.1 let 与 var2.2 const 与 var2.3 模板字符串 三、 es6的解构表达式四、 es6的箭头函数4.1 声明和特点4.2 实践和应用场景4.3 rest和spread 五、es6的对象创建和拷贝5.1 对象创建的语法糖5.2 对象的深拷贝和浅拷贝 六、es6…

【ArcGIS遇上Python】python实现批量XY坐标生成shp点数据文件

单个手动生成:【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层 文章目录 一、问题分析二、解决办法三、注意事项一、问题分析 现有多个excel、txt或者csv格式的坐标数据,需要根据其坐标批量一键生成shp点数据,如下X为经度,…

【Java】SpringMVC参数接收(一)

1、接收单个参数 &#xff08;1&#xff09;直接接收参数 RequestMapping("/hello") RestController public class HelloSpring {RequestMapping("/t2")public String t2(String name){return "name" name;} } 当没有传入参数时&#xff0c;返…

浪花 - 后端接口完善

一、队伍已加入用户数量 1. 封装的响应对象 UserTeamVO 新增字段 hasJoinNum 2. 查询队伍 id 列表 3. 分组过滤&#xff0c;将 team_id 相同的 userTeam 分到同一组 4. 获取每一组的 userTeam 数量&#xff0c;即一个 team_id 对应几个userTeam&#xff08;用户数量&#x…

【Android】MediaCodec学习

在开源Android屏幕投屏代码scrcpy中&#xff0c;使用了MediaCodec去获取和display关联的surface的内容&#xff0c;再通过写fd的方式&#xff08;socket等&#xff09;传给PC端&#xff0c; MediaCodec的处理看起来比较清楚&#xff0c;数据in和数据out 这里我们做另外一个尝试…

Blender教程(基础)-面的细分与删除、挤出选区-07

一、Blender之面的细分 新建一个立方体&#xff0c;在编辑模式下、选中一个面。 在选中的面上单击右键弹出细分选项&#xff0c;选择细分。 在选中细分后、会默认细分1次。修改细分次数在左下角 二、Blender之面的删除 选择中需要操作的面&#xff0c;在英文状态下按X键弹…

ELK日志解决方案

ELK日志解决方案 ELK套件日志系统应该是Elasticsearch使用最广泛的场景之一了&#xff0c;Elasticsearch支持海量数据的存储和查询&#xff0c;特别适合日志搜索场景。广泛使用的ELK套件(Elasticsearch、Logstash、Kibana)是日志系统最经典的案例&#xff0c;使用Logstash和Be…