MySQL8.0新特性学习笔记(二):窗口函数

MySQL8新特性:窗口函数(最新超详细)(内含使用场景及示例) 本文将介绍MySQL8的新特性——窗口函数,从概念、语法、示例各方面详细解析窗口函数,以及解析面试中窗口函数常考的题目和知识点 阅读详情

时间:2020-12-09 10:17:06

MySQL8.0引入的窗口函数,可以比较方便的实现一些分析和统计功能,这些功能不用窗口函数也能实现,不过实现的sql可能会比较复杂。

一,简介

什么是窗口函数

窗口函数引入的其实不只是几个函数,而是一套完整的语法,窗口函数是此语法中的一部分。

语法:

窗口函数 over 窗口表达式。

over是窗口函数语法的关键字。

从语法上来看,窗口函数的使用实际上分为两部分:窗口函数和窗口。

窗口函数在sql中往往使用在查询结果中,返回一列值,就像查询一个字段一样。

窗口

从数据结构上来看,要使用窗口函数,首先我们要有一个窗口,所谓窗口,个人理解是一个数据集,数据集的内容可以类比group by分组之后的一组数据,只不过在使用了窗口函数的sql中,每一行记录都有一个自己的窗口,每行记录所对应的窗口,内容类比group by分组后该行所在的那组。当然这里不是用group by关键字分组了,是在窗口表达式里用专门的语法分组。

窗口函数

定义好了窗口,我们就可以使用窗口函数来对窗口里的数据进行汇总或分析,得到我们想要的那个数据。

MySQL8.0新增了一大堆窗口函数:

  1. 序号函数:row_number() / rank() / dense_rank()

  2. 分布函数:percent_rank() / cume_dist()

  3. 前后函数:lead() / lag()

  4. 头尾函数:first_val() / last_val()

  5. 其他函数:nth_value() / nfile()

另外,MySQL原有的一些聚合函数也可以用在窗口函数的语法中,当做窗口函数使用,比如sum(),avg(),max(),min(),count()等,其实这也很好理解,这些聚合函数本来就是基于分组来操作的,和窗口函数基于窗口来操作其实差不多。

窗口函数和聚合函数相同点和不同点

窗口函数和聚合函数都是基于分组的,窗口函数在窗口表达式中分组,聚合函数在group by语法中分组。

聚合函数会导致返回的行数被汇总和减少,每组一行。窗口函数不影响返回值的行数,原来有几行,用了窗口函数也还是几行,多一个字段而已。

聚合函数可以作为窗口函数在窗口函数的语法中使用。

二,窗口函数的两种写法

1,over关键字后直接定义窗口:

selectrow_number() over (partition by user_no order by amount desc),order_idfrom order_tab;

2,over关键字后使用窗口别名:

select row_number() over w,order_idfrom order_tabWINDOW w AS (partition by user_no order by amount desc);

此时w就是窗口的别名。

三,窗口表达式语法

下面具体看一下窗口表达式的语法。

窗口表达式中可以写三个子句:

1,PARTITION BY子句

PARTITION BY子句是用来分组的,从字面上来看,应该叫分区。理解上可以类比group by。

某行记录所在的分区就是这行对应的窗口。一个窗口可以包含多行,就像group by分的组一样。

使用的语法是:

PARTITION BY <expression>[{,<expression>…}]

其中的expression表达式,可以是列名,也可以是某个计算结果。如果是列名,就代表简单的按照列的值分区。

可以支持按照多个表达式或列来分区。

根据每行记录的值,可以确定每行属于哪个分区,也就是哪个窗口。

2,ORDER BY子句

order by子句是排序用的,决定了属于同一个窗口的行记录的排序方式。语法很简单:

ORDER BY <expression> [ASC|DESC] [{,<expression>…}]

和MySQL中原有的order by关键字意思差不多。原有的order by关键字是所有查询结果一起排序,窗口函数的order by子句是对某个窗口中的行记录进行排序。

3,frame子句

frame子句定义了窗口中的一个子窗口,子集。这个稍微麻烦点,语法是:

frame_unit {<frame_start>|<frame_between>}

frame_unit有两种选择,ROWS和RANGE,ROWS代表按起止位置标识子集,RANGE代表按起止值标识子集。

frame_start标识子窗口的开始位置,结束位置默认是当前行。

frame_between是用BETWEEN AND关键字来标识子窗口的起止位置。

可以标识位置或值的语法有:

  • CURRENT ROW。当前行。

  • UNBOUNDED PRECEDING。分区中的第一行。

  • UNBOUNDED FOLLOWING。分区中的最后一行。

  • expr PRECEDING。当前行减去expr的值。

  • expr FOLLOWING。当前行加上expr的值。

举例:

rows BETWEEN 1 PRECEDING AND 1 FOLLOWING

上面的表达式代表窗口范围前一行到后一行,一共三行记录。

rows UNBOUNDED FOLLOWING

上面的表达式代表窗口范围是当前行到分区中的最后一行。

rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

上面的表达式代表窗口范围是当前分区中所有行,整个frame子句都不写的时候也是这个效果。

四,窗口函数介绍

1,序号函数:row_number(),rank(),dense_rank()

序号函数的作用是显示分区中每行的行号。

三者的区别在于,当排序字段相同时,三个函数的处理结果不同:

  1. row_number():排序字段相同时,行号随机排,下一行行号正常加1。显然此函数得到的行号是连续的。

  2. rank():排序字段相同时,行号相同,下一行行号按照排名确定。这个逻辑比较像是现实中的排名规则,当出现并列冠军时,第三个人排名第三,没有亚军。显然此函数得到的行号是不连续的。

  3. dense_rank():排序字段相同时,行号相同,下一行行号顺序加1。也就是出现冠军时,第三个人排名是第二。显然此函数得到的行号是连续的。

2,分布函数:percent_rank() / cume_dist()

分布函数得到的是一个百分比,计算公式用到rank()函数。

percent_rank()

实际计算公式:(rank()-1)/(rows-1)

其中rank()是rank()函数得到的结果,rows是分区行数。

这个函数想要表达的功能好像不是特别好理解,强行解释一下就是这样的:如果用一条线段表示分区的列表集合,此函数得到的就是每行在线段中的起始位置。

cume_dist()

实际计算公式:rank()/rows

这个函数的含义比较好理解一点,就是小于等于自己排名的行占总行数的比例。

3,前后函数:lead() / lag()

lead (expr,n)代表当前行前面第n行记录的expr表达式(或字段值)。

lag(expr,n)代表当前行后面的第n行记录的expr表达式(或字段值)。

比如lead (add_time,1)就代表当前行前面一行的add_time字段。

这两个函数是基于排序的。

4,头尾函数:first_val() / last_val()

first_val(expr)代表分区第一行记录的expr表达式(或字段值)。

last_val (expr)代表分区最后一行记录的expr表达式(或字段值)。

这两个函数是基于排序的。

5,其他函数:nth_value() / nfile()

nth_value(expr,n)代表区间第n条记录的expr表达式(或字段值)。

比如:nth_value(amount,2)代表区间第二行的amount字段。

nfile(n)代表把区间列分为n个组,返回组号。

注意:

这个分组只能是尽量平均,但有时候不能完全平均,比如分区内有7条数据,用nfile(3)分三组,记录的组号就会是:1,1,1,2,2,3,3。

6,原生聚合函数

比如sum(),avg(),max(),min(),count()等聚合函数,起的作用和他们之前的功能基本相同。

MySQL 8.0窗口函数详解 推荐场景不推荐场景需要保留原始数据行的分析需求简单求和/计数等基础聚合处理排名、移动平均等复杂逻辑单次查询需要多层嵌套子查询分析数据分布(如累计百分比)对超大数据集且无合适索引时。 阅读详情

相关推荐

MySQL8.0的新特性

MySQL 8.0 是 MySQL 数据库的重要升级版本,相比 5.7 版本有多项关键改进:1. 事务性数据字典:元数据存储在 InnoDB 表中,支持 DDL 事务操作,提高崩溃恢复能力。2. 默认字符集改为 utf8mb4,支持完整 Unicode 字符集和更精确的排序规则。3. 新增窗口函数支持复杂数据分析,包括聚合函数、排名函数、分析函数和分布函数。4. 引入通用表表达式(CTE),提高复杂查询的可读性和维护性。5. 新增正则表达式函数,包括模式匹配、替换、提取和定位功能。这些改进使 MySQL 8

m0_68880377的博客 1226

MySQL8新特性:窗口函数(精讲)

本博主将用优快云记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!

weixin_52533007的博客 2322

【MySQL篇】MySQL8.0新特性

窗口函数(Window Function)允许在一组与当前行相关的行上计算值,不分组聚合(保留原表行数),适用于排名、累计统计等场景。,旧版本双写缓冲区刷新是串行的,而8.0可并行刷新多个页到双写缓冲区和数据文件,提升I/O效率;优势:对于非均匀分布列(如订单状态,大部分为“已完成”),直方图能让优化器准确判断行数,避免选错索引。是存储元数据(表结构、列信息、索引等)的事务性存储引擎(基于InnoDB),替代了旧版本的。:角色是权限的集合,适用于批量管理多个用户的权限(如给所有DBA授予相同权限)。

完全体 1002

mysql first_value()_MySQL 常用操作

1 创建/打开/删除数据库create database db;create database db character set utf8mb4;use db;drop database db;alter database db character set utf8mb4;2 修复表mysqlcheck --all-databasesmysqlcheck --all-databases --fas...

weixin_32283253的博客 1073

翻倍密码系统主图指标-行情买卖以及持股-翻倍密码买点-获利了结,通达信炒股软件指标公式

华森制药,上图案例走势,低位出现“开始潜伏”信号,进场红色K线持股待涨,进入“翻倍密码买点”,开启紫色K线的持续上涨,目前也达到了翻倍行情,还没出现“获利了结”的出场信号。这套操盘系统,即便出现信号没走出翻倍行情,也都是可以全身而退,获利出局,或者微微止损出场,并不代表每一个波段都能翻倍,但是走翻倍行情,你按照信号参与或持仓是不会错过的。用这个操盘系统操作,你也不需要天天的盘中看盘,不需要担心盘中的震荡,只要趋势不变,哪怕是偶尔出现跌停,也不影响行情的继续上涨,这都是上涨途中的正常调整。

weixin_69760830的博客 3674

从零开始:在Unity中使用Dynamic Bone实现角色骨骼自然抖动(以女性角色胸部为例)

本文详细介绍了在Unity中使用Dynamic Bone插件实现角色骨骼自然抖动的完整流程,特别以女性角色胸部为例。从插件导入、骨骼系统基础到Dynamic Bone组件配置和参数调优,提供了全面的技术指导。文章还包含性能优化技巧和常见问题解决方案,帮助开发者快速掌握这一物理效果实现方法。

weixin_28728495的博客 453

MySQL Window Functions

原文:MySQL Window Functions Summary: in this tutorial, you will learn about the MySQL window functions and their useful applications in solving analytical query challenges. MySQL has supported window ...

hjw199089的博客 703

Isograph Reliability Workbench 14实战:从零构建故障树分析模型

本文以“马达不转”为例,手把手教你使用Isograph Reliability Workbench 14从零构建故障树分析模型。内容涵盖创建工程、定义顶事件、添加逻辑门与基础事件等核心步骤,并介绍了模型检查与定性定量分析,帮助你系统掌握这一强大的可靠性工程工具。

weixin_29309213的博客 356

[Mysql] FIRST_VALUE()函数 | LAST_VALUE()函数 | NTH_VALUE()函数

FIRST_VALUE()函数 | LAST_VALUE()函数 | NTH_VALUE()函数

Hudas的博客 6448

C# 与 TensorFlow.NET:深度神经网络构建与优化的终极指南

是一个由开源社区维护的 C# 库,它将 TensorFlow 框架的强大功能带到了 C# 开发者的手中。TensorFlow 本身是 Google 开发的一个机器学习框架,广泛应用于深度学习、强化学习等领域。通过 TensorFlow.NET,C# 开发者无需切换语言环境,可以直接在 C# 中构建、训练和优化深度神经网络模型。首先,我们需要定义一个神经网络。该网络将包含输入层、隐藏层和输出层。// 输入张量(XOR 输入,2 个特征)// 输出张量(标签,1 个输出)// 定义第一个隐藏层。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1456

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器是多种方案中的优选项!是一种快速、准确、可靠、应用广泛的传感方案!可有效监测锂离子电池热失控风险,保障化学能储能电站安全!

chicheng_danxin的博客 2410

分析函数——FIRST_VALUE()和LAST_VALUE()

FIRST_VALUE()和LAST_VALUE()字面意思已经很直观了,取首尾记录值。 例:查询部门最早发生销售记录日期和最近发生的销售记录日期 SQL> select *from criss_sales ord...

cuituancheng9378的博客 1569

麒麟V10桌面操作系统安装Qt5.12.3

在虚拟机中如何安装麒麟V10桌面系统,以及在麒麟系统中安装Qt框架,并正常编译运行Qt程序

阿龙的思考 3599

mysql first value_开窗函数 First_Value 和 Last_Value

在Sql server 2012里面,开窗函数丰富了许多,其中带出了2个新的函数 First_Value 和 Last Value .现在来介绍一下这2个函数的应用场景.首先分析一下First_Value(),用法是根据Partition By对数据进行分区,如果忽略Partition By ,那么默认整块数据一个区域,然后根据Order By 进行排序,取出第一个值。;WITH CTE AS(S...

weixin_42306480的博客 1395

OpenWrt南京电信PPPoE IPv6配置:从零搭建稳定双栈网络

本文详细指导如何在南京电信PPPoE宽带环境下,为OpenWrt路由器配置稳定的IPv6双栈网络。核心在于正确设置WAN6接口为DHCPv6客户端,并请求/60前缀,同时配置LAN口分发地址并放行防火墙关键流量,确保内网设备获得原生IPv6连接。

water的专栏 1339

基于深度学习的水果新鲜程度检测系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

本文详细介绍了如何使用YOLO系列模型(YOLOv5、YOLOv6、YOLOv7、YOLOv8)构建水果新鲜度检测系统。通过数据集准备、模型训练、推理过程以及UI界面的实现,我们能够构建一个实时检测水果新鲜度的系统。通过本博客,您可以全面了解如何应用深度学习技术解决实际问题,尤其是在智能监控和食品质量检测领域。

YOLO 815

MySQL - 8.0 新特性详解:窗口函数、CTE 等功能实战

MySQL 8.0 新特性实战摘要 MySQL 8.0 引入了多项重要新特性,显著提升了数据库功能和性能。本文重点介绍了窗口函数和CTE两大核心功能,通过实际业务场景展示其优势。 窗口函数: 支持RANK/DENSE_RANK/ROW_NUMBER等排名函数,解决复杂排序需求 可实现累计销售额计算(ROWS UNBOUNDED PRECEDING) 支持移动平均等时间序列分析(ROWS BETWEEN 2 PRECEDING) 相比子查询方式性能提升明显 CTE(公用表表达式): 提供WITH语法创建临时结

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MySQL 8.0 新特性之窗口函数

介绍 MySQL 8.0 中的一个新特性:窗口函数。窗口函数(Window Function)针对查询中的每一行数据,基于和它相关的一组数据计算出一个结果。

Tony.Dong的专栏 2295

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MySQL8新特性 窗口函数介绍、使用、实战

MySQL从8.0版本开始支持窗口函数。窗口函数的作用类似于在查询中对数据进行分组,不同的是,分组操作会把分组的结果聚合成一条记录,而窗口函数是将结果置于每一条数据记录中。窗口函数可以分为静态窗口函数和动态窗口函数。静态窗口函数的窗口大小是固定的,不会因为记录的不同而不同;动态窗口函数的窗口大小会随着记录的不同而变化。提示:使用 select version();查看 MySQL 版本是否支持语法。MySQL官方网站窗口函数的网址为。

codechatter的博客 1636

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

1302-MySQL 8.0 新特性概览:窗口函数、CTE、JSON 增强等

MySQL 8.0 相较于 5.7 带来了 **性能优化、SQL 语法增强、JSON 处理能力提升** 等诸多新特性。本文将重点介绍 **窗口函数(Window Functions)、公用表表达式(CTE)、JSON 增强** 等关键特性,帮助开发者更好地利用 MySQL 8.0 的强大功能。

1927

Mysql8.0版本新特性

使用 invisible 创建表 或者 进行 表变更中设置索引为 隐藏索引. 这时,索引隐藏不可见, 但是数据库会在后台继续维护隐藏. 这个隐藏索引, 在查询时,甚至 force index 都不会使用. 这个隐藏索引的主要作用是: 一些索引不确定是否有需要, 如果进行删除,后续又需要恢复这个索引, 假如数据量很大,那么就会耗费大量时间. 这时就可以将索引设置为隐藏索引, 等需要时 直接恢复即可.在Mysql 8.0之前,如果在查询中 加入了函数,会导致索引失效. Mysql 8.0 就引入了函数索引.

weixin_44531533的博客 2168

MySQL8.0概述及新特性

MySQL8.0概述及新特性

小草的博客 5447

Mysql8.0新特性——窗口函数

Mysql8.0的新特性你还不知道吗?窗口函数用好了,复杂需求sql要简单一半!本文将带大家学习窗口函数!

CodeSuc 的技术博客 1379

mysql8.0的窗口函数的使用详解

mysql8.0的窗口函数使用详解

qq_1149513559的博客 1662
上一篇: 猜你喜欢按百分比推荐
下一篇: mysql中group by和order by同时使用无效的替代方案
springdk2009
博客等级 码龄17年 1835粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值