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

MYSQL8窗口函数

MYSQL8窗口函数

    • MYSQL8窗口函数
      • 窗口函数分类
      • 序号函数--排行榜
        • row_number()示例
        • rank()示例
        • dense_rank()示例
          • partition by对每个分区内的行进行排名
          • 不加partition by全局排序
      • 开窗聚合函数
      • 分布函数
        • CUME_DIST()
        • PERCENT_RANK()
      • 前后函数
        • LAG()的用法
        • LEAD()
      • 头尾函数
      • 其他函数
        • NTH_VALUE()
        • NTILE()

MYSQL8窗口函数

https://www.runoob.com/mysql/mysql-functions.html
image.png


窗口函数分类

image.png

  • 序号函数
  • 分布函数
  • 前后函数
  • 头尾函数
  • 其他函数
  • 开窗聚合函数

序号函数–排行榜

序号函数的作用主要是用来给结果排名次的,比如说第一名,第二名…
image.png
三种排名综合演示:
image.png


row_number()示例

row_number()函数的作用主要是给排序结果添加编号的。
image.png
image.png
image.png


rank()示例

和 ROW_NUMBER() 函数类似。但是它有一些不同之处:RANK() 函数会跳过相同的排序值,而不是分配相同的排名。
比如,排序编号是并列第一,没有第二名,然后是第三名,并列第四名,么有第五名。
image.png


dense_rank()示例

和RANK() 函数类似,但不会跳过相同的排序值。
比如:排序编号有并列第一,并列第二,第三名,中间没有空位,是连续的值。
image.png


partition by对每个分区内的行进行排名

在 MySQL 8 中,使用 DENSE_RANK() 函数时,可以通过在 OVER 子句中加入 PARTITION BY 子句来对每个分区内的行进行排名。PARTITION BY 子句与 GROUP BY 子句类似,它将查询结果划分为多个分区,并且在每个分区内使用 DENSE_RANK() 函数来给行分配排名。

假设有一个名为 订单(orders)的表,其中存储了每位客户下的订单信息,包括客户ID、订单日期和订单金额等列。表结构如下所示:

-- 创建订单表
CREATE TABLE orders (id INT PRIMARY KEY,customer_id INT,order_date DATE,amount DECIMAL(10, 2)
);-- 插入数据
INSERT INTO orders (id, customer_id, order_date, amount) VALUES
(1, 101, '2021-01-01', 1000.00),
(2, 102, '2021-01-02', 1500.00),
(3, 103, '2021-01-03', 1200.00),
(4, 101, '2021-01-04', 800.00),
(5, 102, '2021-01-05', 2000.00),
(6, 104, '2021-01-06', 1800.00),
(7, 105, '2021-01-07', 900.00),
(8, 101, '2021-01-08', 1600.00),
(9, 102, '2021-01-09', 1100.00),
(10, 106, '2021-01-10', 2200.00);

现在,我们要对该表进行排名,并按照客户ID分组计算订单排名。

-- 对该表进行排名,并按照客户ID分组计算订单排名
SELECT 
customer_id AS 客户ID, 
order_date AS 订单日期, 
amount AS 订单金额,
DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY amount DESC) AS 排名
FROM orders;

该语句使用 DENSE_RANK() 函数根据客户ID进行分组,并使用订单金额降序排序。结果集将返回每个客户的所有订单,并为每个订单分配排名。
执行上面的查询后,返回的结果如下所示:
image.png
可以看到,每个客户的订单按照金额进行排名,并且在每个分组内都获得了相应的排名。如果有多个订单拥有相同金额,则他们将会获得相同的排名。


不加partition by全局排序

以下是一个不使用 PARTITION BY 的示例:
假设有一个名为 员工(employees)的表,其中存储了每位员工的 ID、姓名和薪资等列。表结构如下所示:

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),salary DECIMAL(10, 2)
);INSERT INTO employees (id, name, salary) VALUES
(1, '张三', 5000.00),
(2, '李四', 7000.00),
(3, '王五', 5500.00),
(4, '赵六', 6000.00),
(5, '刘七', 8000.00);

现在,我们要对该表进行排名,并按照薪资降序排序。可以使用如下 SQL 语句:

SELECT 
id AS 员工ID, 
name AS 姓名, 
salary AS 薪资,
RANK() OVER (ORDER BY salary DESC) AS 排名
FROM employees;

该语句使用 RANK() 函数对整个表进行排序,并根据每个员工的薪资进行排名。结果集将返回所有员工的信息,并为他们分配排名。
执行上述查询后,返回的结果如下所示:
image.png
可以看到,每个员工根据薪资进行排名,并且获得了相应的排名。如果有多个员工拥有相同的薪资,则他们将会获得相同的排名。由于我们没有使用 PARTITION BY 子句,因此在整张表内都只有一个分组,所有员工都根据薪资进行排名。


开窗聚合函数

image.png
image.png
image.png

这是一个使用窗口函数 SUM() 的 SQL 查询,它计算每个部门中员工过去 3 行记录的薪资总和,并将其作为别名 c1 返回。
具体来说,语句中的 OVER() 子句用于定义一个窗口(window),其中包含每个部门 dname 中的所有员工。接下来,PARTITION BY 子句将该窗口分成多个分区,每个分区都根据 dname 列进行分组。因此,在这个查询中,每个分区都对应着同一部门的员工。
窗口函数 SUM() 将在每个分区内的每个行上执行,计算出当前行以及前三行的薪资总和。在这里,ORDER BY hiredate 指定了如何排序每个分区内的行,按照 hiredate 列的值进行升序排列。ROWS BETWEEN 3 PRECEDING AND CURRENT ROW 子句指定了要计算的行的范围,即从当前行向前数 3 行到当前行本身。
最后,查询结果将包含每个员工的姓名、所在部门、薪资和部门内前三个员工的薪资总和(c1)。由于这个查询中使用了窗口函数,因此返回的结果集中可能会包含多个行,而不是仅仅一行。

SELECT dname,ename,salary,sum(salary) OVER(PARTITION BY dnameORDER BY hiredate ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) as c1;

image.png


分布函数

分布函数一般是用来计算占比的。
能够计算排名、行号、百分位数等统计信息的函数,它们可以对查询结果进行排序、分组和限制,进而实现更加高级的数据分析和处理。


CUME_DIST()

image.png
image.png

在这里插入图片描述


image.png


PERCENT_RANK()

image.png
image.png
image.png


前后函数

image.png


LAG()的用法

image.png

image.png
image.png
image.png

在这里插入图片描述


LEAD()

image.png


在这里插入图片描述


头尾函数

在这里插入图片描述


image.png

在这里插入图片描述


其他函数


NTH_VALUE()

image.png

在这里插入图片描述


NTILE()

image.png

在这里插入图片描述


image.png

在这里插入图片描述


在这里插入图片描述

相关文章:

MYSQL8窗口函数

MYSQL8窗口函数 MYSQL8窗口函数窗口函数分类序号函数--排行榜row_number()示例rank()示例dense_rank()示例partition by对每个分区内的行进行排名不加partition by全局排序 开窗聚合函数分布函数CUME_DIST()PERCENT_RANK() 前后函数LAG()的用法LEAD() 头尾函数其他函数NTH_VALU…...

全国大学生智能汽车竞赛——安装Ubuntu操作系统(双系统)

1.1 电脑分区 1.1.1 分区原因 由于我们想要在电脑上同时安装Windows和Ubuntu系统,所以就要在window使用的内存中划分出来一段用来给Ubuntu系统使用,相当于一个应用程序一样 1.1.2 分区步骤 1.右击此电脑,点击管理,然后双击左侧…...

[STM32F103C8T6]看门狗

看门狗: 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造 成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 造成整个…...

浪潮:2022年净利同比增长51.39%

一、4月头条 华为的紧急回应,让东方材料21亿收购要黄? 4月10日消息,东方材料昨日晚间公告拟定增募资不超20亿元,用于向诺基亚全资子公司NSN收购TD TECH 51%股权(交易对价21.22亿元)。TD TECH剩余49%股权由…...

大厂面试内幕:阿里内部整理出的5000页Java面试复盘指南,起飞!!!

互联网的技术岗一直是高薪的代名词,特别是大厂,应届生的年薪基本都20W起,比一般的公司高多了。 看下面这张网上热传的大厂应届生薪酬表就知道了,SP offer甚至能拿到30W以上。 技术社区也有晒出高薪offer的同学: 除了薪…...

数据结构——哈希表相关题目

数据结构——哈希表相关题目 242. 有效的字母异位词1.暴力解法2.排序后比较3.哈希表 383. 赎金信哈希解法 49. 字母异位词分组438. 找到字符串中所有字母异位词3. 无重复字符的最长子串76. 最小覆盖子串349. 两个数组的交集1.排序双指针2.哈希表 350. 两个数组的交集 II1.排序双…...

域名解析设置方法

域名解析设置都是实时生效的,一般只需几秒即可同步到各地 DNS 上,但各地 DNS 均有缓存机制,解析的最终生效取决于各运营商刷新时间! 一、A记录 ①.主机名必须填写; 常用主机名有:www//*,效果参见上图说明&…...

MySQL连接空闲时间超过8小时报错原因与延伸知识

1 错误原因 1.1 两个参数 MySQL服务端两个参数控制连接超时时间: wait_timeoutinteractive_timeout1.1.1 如何查看 show global variables like interactive_timeout show global variables like wait_timeout 复制代码 1.1.2 含义与区别 wait_timeout&#xf…...

Flutter渲染原理

一 Widget Element RenderObject 之间的关系 1 Widget 在Flutter 中,万物皆是Widget,无论是可见的还是功能型的。一切都是Widget. 官方文档中说的Widget 使用配置和状态来描述View 界面应该长什么样子。 它不仅可以表示UI元素,也可以表示一些功能性的…...

PathCore:IAD文献解读

论文链接:[Towards Total Recall in Industrial Anomaly Detection]Towards Total Recall in Industrial Anomaly Detection :数据集, :标签 : 在ImageNet上预训练后的网络 第 张图 网络中第 层 1. Locall…...

C语言判断一个日期是在该年的第几天案例讲解

今天是2023年4月11号,我们就用今天举例得出是2023年的第几天。 思路分析 1)我们想知道2023年4月11号是2023年的第几天,只需要把1到3月份的天数累加求和然后加上今天日期也就是11就可以算出2023年4月11号是2023年的第几天。 推广:…...

【超全总结】集成环信消息推送注意事项(华为、oppo、vivo等)

环信即时通讯 IM 支持集成第三方厂商的消息推送服务,为 Android 开发者提供低延时、高送达、高并发、不侵犯用户个人数据的离线消息推送服务。 当客户端应用进程被关闭等原因导致用户离线,环信即时通讯 IM 服务会通过第三方厂商的消息推送服务向该离线用…...

C++回调函数以及epoll中回调函数的使用

回调函数是一种常用的编程技术,它允许程序在运行时将一个函数作为参数传递给另一个函数,以实现更加灵活和可扩展的功能。在C中,回调函数通常被实现为函数指针或者函数对象。 函数指针是指向函数的指针变量,可以通过它来调用函数。…...

0基础学习软件测试有哪些建议

其实现在基础的资料和视频到处都是,就是看你有没有认真的去找学习资源了,去哪里学习都是要看你个人靠谱不靠谱,再好的教程和老师,你自己学习不进去也是白搭在正式选择之前,大可以在各种学习网站里面找找学习资源先自己…...

MySQL数据类型

文章目录一、数据类型分类二、数值类型1. tinyint 类型2. bit 类型3. int 类型4. float 类型5. decimal 类型三、字符串类型1. char 类型2. varchar 类型3. char 和 varchar 比较4.日期和时间类型5. enum 和 set一、数据类型分类 数据类型本质也是一种约束! 如果插入…...

【设计模式】从Mybatis源码中学习到的10种设计模式

文章目录 一、前言二、源码:学设计模式三、类型:创建型模式1. 工厂模式2. 单例模式3. 建造者模式 四、类型:结构型模式1. 适配器模式2. 代理模式3. 组合模式4. 装饰器模式 五、类型:行为型模式1. 模板模式2. 策略模式3. 迭代器模式…...

爬虫攻守道 - 猿人学第20题 - 殊途同归

写在开头 这题也是,自己搞顶多追踪到wasm代码,然后就走不下去了。找了2个参考方案,自己做的过程中还又遇到些新的问题,下面做个记录。解法1参考文章解法2参考文章 解法1:追根溯源 在 JS 代码中追踪到 Payload 赋值位…...

4.11日报

synchronized 和 ReentrantLock 区别是什么? synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。 主要区别如下: ReentrantLock …...

【LeetCode每日一题: 1039. 多边形三角剖分的最低得分 | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…...

Okio 网络提速

文章目录网络数据处理流程Page Cache传统 I/O 拷贝的性能问题零拷贝技术DMA 技术零拷贝技术分类mmapsendfilespliceDirect I/O零拷贝技术性能分析小结OkioOkio 的使用Okio 网络提速的原理Okio 总结总结网络数据处理流程 在讲 Okio 之前,为了能更好的了解 Okio 的优…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...