[Database] MySQL 8.x Window / Partition Function (窗口/分区函数)

news2024/9/23 9:26:54

🧲相关文章

[1] MySQL 系统表解析以及各项指标查询
[2] MySQL 5.7+ JSON 字段的使用的处理
[3] MySQL经典练习50题

简介

MySQL 8.0+版本开始支持窗口函数 官方文档 在之前的版本中已存在的大部分聚合函数,在MySQL 8 中也可以作为窗口函数来使用

在这里插入图片描述

方法 / 步骤

Partition Function (分区函数)

Window Function (窗口函数)

函数分为两部分,一部分是函数名称,窗口函数的数量比较少,总共才11个窗口函数+聚合函数(所有的聚合函数都可以用作窗口函数)。根据函数的性质,有的需要写参数,有的不需要写参数。

  • 窗口函数相关支持
函数名称描述
CUME_DIST()累积分配值
DENSE_RANK()当前行在其分区中的排名,稠密排序
FIRST_VALUE()指定区间范围内的第一行的值
LAG()取排在当前行之前的值
LAST_VALUE()指定区间范围内的最后一行的值
LEAD()取排在当前行之后的值
NTH_VALUE()指定区间范围内第N行的值
NTILE()将数据分到 N 个桶,当前行所在的桶号
PERCENT_RANK()排名值的百分比
RANK()当前行在其分区中的排名,稀疏排序
ROW_NUMBER()分区内当前行的行号

TopN相关函数
ROW_NUMBER():顺序排序——1、2、3
RANK():并列排序,跳过重复序号——1、1、3
DENSE_RANK():并列排序,不跳过重复序号——1、1、2

# 窗口函数语法 
func_name(<parameter>) 
OVER([PARTITION BY <part_by_condition>] 
[ORDER BY <order_by_list> ASC|DESC])

窗口函数与分组聚合函数比较相似,都是通过指定字段将数据分成多份,区别在于:

  • SQL 标准允许将所有聚合函数用作窗口函数,用OVER 关键字区分开窗函数和聚合函数。
  • 聚合函数每组只返回一个值,开窗函数每组可返回多个值。

在这11个窗口函数中,实际工作中用的最多的当属ROW_NUMBER()、RANK()、DENSE_RANK()这三个排序函数了。下面我们通过一个简单的数据集学习一下这三个开窗函数。

CREATE TABLE sales_log
( 
sale_date date COMMENT '销售时间', 
name char(2) COMMENT '销售员姓名', 
sales int COMMENT '销售额度'
) ENGINE=InnoDB COMMENT='销售记录';; 

INSERT INTO sales_log VALUES
('2021/1/1', '丁一', 100), 
('2021/2/1', '丁一', 310), 
('2021/2/1', '李四', 200), 
('2021/3/1', '李四', 210), 
('2021/2/1', '刘猛', 300), 
('2021/3/1', '刘猛', 310), 
('2021/1/1', '王二', 150), 
('2021/2/1', '王二', 180), 
('2021/3/1', '王二', 190), 
('2021/1/1', '张三', 250), 
('2021/2/1', '张三', 280), 
('2021/3/1', '张三', 290);
# 数据查询 
SELECT * FROM sales_log; 
# 对每月销售员业绩从好到坏进行排名
SELECT sale_date,name,sales, 
    ROW_NUMBER() OVER(PARTITION BY sale_date ORDER BY sales DESC) as sales_order 
FROM sales_log;

# 查询每月业绩最好的销售员
SELECT * FROM
( SELECT sale_date,name,sales, 
    ROW_NUMBER() OVER(PARTITION BY sale_date ORDER BY sales DESC) as sales_order 
FROM sales_log ) AS t
WHERE sales_order = 1;
  • 初始化数据
# 首先创建虚拟的用户登record_user_login录表,并插入数据 
create table record_user_login
( 
user_id bigint(20)  COMMENT '用户ID', 
login_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '登录时间'
); 
 
 
# 初始化数据 
insert into record_user_login values
(1,'2025-11-25 13:21:12'), 
(1,'2025-11-24 13:15:22'), 
(1,'2025-11-24 10:30:15'), 
(1,'2025-11-24 09:18:27'), 
(1,'2025-11-23 07:43:54'), 
(1,'2025-11-10 09:48:36'), 
(1,'2025-11-09 03:30:22'), 
(1,'2025-11-01 15:28:29'), 
(1,'2025-10-31 09:37:45'), 
(2,'2025-11-25 13:54:40'), 
(2,'2025-11-24 13:22:32'), 
(2,'2025-11-23 10:55:52'), 
(2,'2025-11-22 06:30:09'), 
(2,'2025-11-21 08:33:15'), 
(2,'2025-11-20 05:38:18'), 
(2,'2025-11-19 09:21:42'), 
(2,'2025-11-02 00:19:38'), 
(2,'2025-11-01 09:03:11'), 
(2,'2025-10-31 07:44:55'), 
(2,'2025-10-30 08:56:33'), 
(2,'2025-10-29 09:30:28'); 

# 查看数据 
SELECT * FROM record_user_login;

参考资料 & 致谢

[1] MySQL 8.0 新特性
[2] MySQL 开窗函数

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

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

相关文章

地址空间收尾-进程控制

子进程为什么能继承父进程的环境变量呢&#xff1f;并且具有全局属性&#xff1f; 通过打印地址实验可以发现&#xff0c;进程的环境变量在栈区之上 父进程的环境变量也是由bash继承下来的&#xff0c;必定有页表帮助我们从虚拟到物理的映射&#xff0c;创建子进程的页表时也会…

PowerCLI 实现email发送消息

前提条件 开启wmi,配置网卡,参考 创建发送获取信息到邮件 最终实现获取esxi 主机版本信息, esxi 主机IP,esxi开机开启状态,虚拟机名称,虚拟机IP,虚拟机开机状态,虚拟机归属哪一个物理机,发送信息到邮箱。脚本解释以下全部注释解释,请你在#部分获取。powercli-send-e…

HTML页面获取URL传递的参数值

如&#xff1a; // 查询url上链接的参数与参数值 function getQueryString(name) {var url window.location.search; // 获取URLvar pattern new RegExp("[\?\&]" name "([^\&])", "i"); // 正则匹配URLvar matcher pattern.exec(…

村田:什么是UWB无线通信?使用UWB的定位方法有哪些应用 ​

UWB是Ultra-Wide Band的缩写&#xff0c;意思是超宽带。UWB无线通信是使用超宽带的频率带宽的无线通信&#xff0c;其主要特征是能够实现高精度定位。近年来&#xff0c;已普及至智能手机防丢失、高阶汽车智能钥匙等民用设备。预计未来将在多个领域普及。 UWB无线通信技术有哪些…

浙江环保用电计量adw300-hj治污产污生产设备监测

浙江环保用电计量表&#xff0c;浙江环保用电能表&#xff0c;浙江环保督查计量电表&#xff0c;环保设备能耗采集表 企业基本信息 企业名称&#xff1a;XXXXXXXXXXX 企业地址&#xff1a;XX省XX市 工 程 量&#xff1a;X台监测仪表 预计工期&#xff1a;X天 监测点位信息…

Git撤销已经push到远程分支的commit

有时想要撤销已经push到远程仓库的commit&#xff0c;将代码还原为commit之前的样子&#xff0c;应该如何做呢&#xff1f; 如果只有自己使用的分支&#xff1a;可以使用git reset命令 git log 查看需要还原的commitId&#xff0c;如下截图&#xff0c; 我们需要撤销ffe4a的…

【API篇】十、生成Flink水位线

文章目录 1、水位线的生成原则2、有序流内置水位线3、乱序流内置水位线4、自定义周期性水位线生成器5、自定义断点式水位线生成器6、从数据源中发送水位线 1、水位线的生成原则 水位线出现&#xff0c;即代表这个时间之前的数据已经全部到齐&#xff0c;之后不会再出现之前的数…

具有独特底部轮廓的剥离光刻胶的开发

引言 金属图案的剥离方法已广泛应用于各种电子器件的制造过程中&#xff0c;如半导体封装、MEMS和LED的制造。与传统的金属刻蚀方法不同的是&#xff0c;采用剥离法的优点是节省成本和工艺简化。在剥离过程中&#xff0c;经过涂层、曝光和开发过程后&#xff0c;光刻胶会在晶片…

最简单的Ubuntu更新Nvidia驱动的方法 解决nvidia-smi 不是内部或外部命令

在装有Ubuntu/Linux的服务器上遇到nvidia-smi不是内部或外部命令的问题&#xff0c;解决方法&#xff1a;更新英伟达驱动。 Ubuntu自带的“软件和更新”里可以方便地更新驱动&#xff0c;不需要从英伟达官网下载驱动。 我把它改成了第一项&#xff08;原来是一个名为nouveau的…

点成案例 | 点成生物干浴器的多领域应用

前沿 在前面的文章中&#xff0c;我们给大家分享了点成生物水浴设备在食品行业的食物特性和生物活性测定的应用案例&#xff0c;本期文章将为大家详细介绍一下点成生物的干浴设备及其在多种领域中的应用。 一、干浴器简介 干浴器&#xff0c;又名恒温金属浴或金属浴。与水浴设…

好用的Visio绘图文件工具 VSD Viewer最新 for mac

VSD Viewer是一款可以查看Microsoft Visio绘图文件的工具&#xff0c;适用于Windows和macOS操作系统。它具有以下优点&#xff1a; 直观易用&#xff1a;VSD Viewer的用户界面非常简单直观&#xff0c;易于使用。支持多种文件格式&#xff1a;VSD Viewer支持多种Visio文件格式…

JavaScript函数:入门指南

目录 函数的定义和调用 函数参数 返回值 匿名函数 回调函数 箭头函数的定义和语法 箭头函数的参数和返回值 箭头函数的this绑定 递归函数简介 基本情况 递归调用 注意事项 递归的应用 JavaScript是一种广泛使用的编程语言&#xff0c;拥有强大的函数功能。函数是J…

Java基础——流程控制

文章目录 顺序结构分支结构ifif elseswitch 循环结构forwhiledo while嵌套循环 流程控制语句breakcontinuereturn 流程控制语句是用来控制程序中各语句执行顺序&#xff0c;可以把语句组合成能完成一定功能的小逻辑模块。 顺序结构 程序从上到下逐行执行&#xff0c;中间没有…

系统优化-异步化

目录 1:异步化 1.1:什么是同步?什么是异步? 1.2:异步化业务流程分析 1.3:异步化的问题 2:线程池的理论和实战 2.1:为啥需要线程池? 2.2:线程池的实现 2.2.1:线程池参数 2.2.2:线程池的工作机制 1:异步化 什么时候使用异步化? 调用的服务处理能力有限&#xff0c…

酷开科技 | 酷开系统大屏电视,打造精彩家庭场景

在信息资讯不发达的年代&#xff0c;电视机一直都是个人及家庭重要的信息获取渠道和家庭娱乐中心&#xff0c;是每个家庭必不可少的大家电之一&#xff01;在快节奏的现代生活中&#xff0c;受手机和平板的冲击&#xff0c;电视机这个曾经的客厅“霸主”一度失去了“主角光环”…

Haproxy 服务

Haproxy&#xff1a;他也是常用的负载均衡软件 nginx 支持四层转发&#xff0c;七层转发 haproxy 也是四层和七层转发 LVS的DR和NAT都是基于四层转发 都是基于流量的转发。 tun:四层和七层都有。 基于四层的转发&#xff1a; 1&#xff0c;lvs 2&#xff0c;nginx 3&…

Go语言入门心法(十六):Go远程过程调用框架GRPC实战

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

vue-admin相关问题记录

编辑器设置自定义高度 base.component.js内关于tinymce内容初始化设置&#xff0c;增加高度自定义接收并初始化 <tinymce :content.sync"form.article_content" :height"400"></tinymce> textarea自定义高度 tooltip备注

Python数据结构(树)

Python数据结构&#xff08;树&#xff09; 树的概念 树(英语: tree)是一种抽象数据类型ADT) 或是实作这种抽象数据类型的数据结构&#xff0c;用来模拟具有树状结构性质的数据集合。它是由n(n>1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一…