MySQL必会四大函数-窗口函数

news2025/7/18 10:31:40

在了解窗口函数之前,我们必须了解聚合函数。常见的聚合函数,包括 AVG、COUNT、MAX、MIN、SUM 以及 GROUP_CONCAT,常和GROUP BY 函数一起使用。聚合函数的作用就是对一组数据行进行汇总计算,并且返回单个分析结果。

窗口函数和聚合函数类似之处在于它也是对一组数据进行分析;但是,窗口函数不是将一组数据汇总为单个结果;而是针对查询中的每一行数据,基于和它相关的一组数据计算出一个结果。下图演示了聚合函数和窗口函数的区别:

window function

我们可以看到聚合函数都会减少查询返回的行数。

与带有GROUP BY子句的聚合函数一样,窗口函数也对行的子集进行操作,但它们不会减少查询返回的行数。

 接下来以实际的例子来直观感受下窗口函数

表account1:  acct 字段为帐号,cus_no 字段为客户号,open_org字段为开户行,status字段为状态,bal为客户在该行的存款余额。

select open_org, sum(bal)
from acount1
group by open_org

select cust_no,open_org,bal, sum(bal) over(partition by open_org)
from acount1


 窗口函数的定义

window_function ( expr ) OVER (
    PARTITION BY ...
    ORDER BY ...
    frame_clause
)

 其中,window_function 是窗口函数的名称;expr 是参数,有些函数不需要参数;OVER子句包含三个选项:分区(PARTITION BY)、排序(ORDER BY)以及窗口大小(frame_clause

 分区(PARTITION BY

PARTITION BY选项用于将数据行拆分成多个分区(组),窗口函数基于每一行数据所在的组进行计算并返回结果,它的作用类似于GROUP BY分组。

select cust_no as '客户号',open_org as '支行名称',
bal as '帐号余额', sum(bal) over(partition by open_org) as '支行总金额'
from acount1

 

 支行A拥有存款 100+200+100+200 = 600,支行B拥有存款300+400+500+600+700 = 2500。

SQL 标准要求 PARTITION BY 之后只能使用字段名,不过 MySQL 允许指定表达式。另外,我们也可以在 PARTITION BY 之后指定多个分组字段,例如同时按照部门和性别进行分组分析。

排序(ORDER BY) 

OVER 子句中的ORDER BY选项用于指定分区内的排序方式,与 ORDER BY 子句的作用类似,通常用于数据的排名分析。以下示例用于计算每个客户帐号在支行内的余额排名

select cust_no as '客户号',open_org as '支行名称',bal as '帐号余额',
       rank() over(partition by open_org order by bal desc) as '帐号余额支行内排名'
from acount1

帐号1、客户c01在A支行内存款200 排名1;帐号2、客户c02在A支行内存款200 排名1...

帐号5、客户c04在B支行内存款700 排名1;帐号9、客户c01在B支行内存款100 排名5...

其中,PARTITION BY 选项表示按照部门进行分区;ORDER BY 选项指定在分区内按照月薪从高到低进行排序;RANK 函数用于计算名次,该函数将会在下文中进行介绍。

窗口大小(frame_clause) 

frame_clause选项用于在当前分区内指定一个计算窗口,也就是一个与当前行相关的数据子集。指定了窗口之后,分析函数不再基于分区进行计算,而是基于窗口内的数据进行计算。窗口会随着当前处理的数据行而移动,例如:

  • 定义一个从分区开始到当前数据行结束的窗口,可以计算截止到每一行的累计总值。
  • 定义一个从当前行之前 N 行数据到当前行之后 N 行数据的窗口,可以计算移动平均值。

窗口函数常用参数

{ ROWS | RANGE } frame_start
{ ROWS | RANGE } BETWEEN frame_start AND frame_end

其中,ROWS表示以行为单位指定窗口的偏移量,RANGE表示以数值为单位指定窗口的偏移量。frame_startframe_end 分别表示窗口的开始行和结束行,它们的可能取值如下:

CURRENT ROW --对于 ROWS 方式,代表了当前行;对于 RANGE,代表了当前行的所有对等行。
UNBOUNDED PRECEDING --代表了分区中的第一行。
UNBOUNDED FOLLOWING --代表了分区中的最后一行。
expr PRECEDING --对于 ROWS 方式,代表了当前行之前的第 expr 行;对于 RANGE,代表了等于当前行的值减去 expr 的所有行;如果当前行的值为 NULL,代表了当前行的所有对等行。
expr FOLLOWING --对于 ROWS 方式,代表了当前行之后的第 expr 行;对于 RANGE,代表了等于当前行的值加上 expr 的所有行;如果当前行的值为 NULL,代表了当前行的所有对等行。

如果只有 frame_start,默认以当前行作为窗口的结束。如果同时指定了两者,frame_start 不能晚于 frame_end,例如 BETWEEN 1 FOLLOWING AND 1 PRECEDING 就是一个无效的窗口。下图可以方便我们理解这些选项的含义

frame

 以下示例按照支行统计客户的累计存款值

select cust_no as '客户号',open_org as '支行名称',bal as '帐号余额',
       sum(bal) over(partition by open_org order by bal desc rows unbounded preceding) as '支行积累存款'
from acount1


 常见的窗口函数

 聚合窗口函数

常用的聚合函数,例如 AVG、SUM、COUNT 等,也可以作为窗口函数使用。

这里不多举例,可以看上面的例子

排名窗口函数

排名窗口函数用于对数据进行分组排名。常见的排名窗口函数包括:

  • ROW_NUMBER,为分区中的每行数据分配一个序列号,序列号从 1 开始分配。
  • RANK,计算每行数据在其分区中的名次;如果存在名次相同的数据,后续的排名将会产生跳跃。
  • DENSE_RANK,计算每行数据在其分区中的名次;即使存在名次相同的数据,后续的排名也是连续的值。
  • PERCENT_RANK,以百分比的形式显示每行数据在其分区中的名次;如果存在名次相同的数据,后续的排名将会产生跳跃。
  • CUME_DIST,计算每行数据在其分区内的累积分布,也就是该行数据及其之前的数据的比率;取值范围大于 0 并且小于等于 1。
  • NTILE,将分区内的数据分为 N 等份,为每行数据计算其所在的位置。
select cust_no as '客户号',open_org as '支行名称',bal as '帐号余额',
       ROW_NUMBER() OVER (PARTITION BY open_org ORDER BY bal DESC) AS "row_number",
       RANK() OVER (PARTITION BY open_org ORDER BY bal DESC) AS "rank",
       DENSE_RANK() OVER (PARTITION BY open_org ORDER BY bal DESC) AS "dense_rank",
       PERCENT_RANK() OVER (PARTITION BY open_org ORDER BY bal DESC) AS "percent_rank"
from acount1;

取值窗口函数 

取值窗口函数用于返回指定位置上的数据。常见的取值窗口函数包括:

  • FIRST_VALUE,返回窗口内第一行的数据。
  • LAST_VALUE,返回窗口内最后一行的数据。
  • NTH_VALUE,返回窗口内第 N 行的数据。
  • LAG,返回分区中当前行之前的第 N 行的数据。
  • LEAD,返回分区中当前行之后第 N 行的数据
select cust_no as '客户号',open_org as '支行名称',bal as '帐号余额',
       first_value(bal) OVER(partition by open_org) "支行最低存款",
       last_value(bal) OVER(partition by open_org) "支行最高存款",
       nth_value(bal, 2) OVER(partition by open_org) "支行第二低存款"
from acount1;

 

 

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

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

相关文章

用最新版 VoxEdit 来提升你们的创造力!

众所周知,VoxEdit 可以为你们提供 Voxel 资产建模、装配和制作动画并与全世界分享的一站式服务,而这些全都是免费的。我们一直倾听社区意见并希望让所有人都能更容易进入 The Sandbox 元宇宙。VoxEdit 最新更新版本已经推出!为了软体更本土化…

MySQL的触发器

目录 一.概述 介绍 触发器的特性 操作—创建触发器 操作—new和old 操作—查看触发器 操作—删除触发器 注意事项 一.概述 介绍 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是…

MACD红二波选股公式,选出MACD二次翻红的标的

经过一段上涨行情之后,市场出现了时间稍长或者幅度稍大的调整,MACD指标的DIF、DEA会出现死叉,柱线由红色转变为绿色。 而调整时间较短或者幅度较小,MACD红柱会缩短,但不出现绿柱,之后红柱开始变长&#xff…

Python-第六天 Python数据容器

Python-第六天 Python数据容器一、数据容器入门1.数据容器二、数据容器:list(列表)1.列表的定义2.列表的下标(索引)3.列表的常用操作(方法)4.练习案例:常用功能练习5.list(列表)的遍历5.1 列表的…

RabbitMQ 入门到应用 ( 三 ) 交换机分类

4.交换机 Exchange 分类 4.0.创建队列Queue 在 操作界面 分别 添加 fivemall.goods fivemall.order fivemall.admin yuan.admin 四个队列 4.1.Direct Exchange(直接交换机) 该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是说路由…

JavaScript JSON

文章目录JavaScript JSON什么是 JSON?JSON 实例JSON 格式化后为 JavaScript 对象JSON 语法规则JSON 数据 - 一个名称对应一个值JSON 对象JSON 数组JSON 数组JSON 字符串转换为 JavaScript 对象相关函数JavaScript JSON JSON 是用于存储和传输数据的格式。 JSON 通常用于服务端…

简单实用的CSS属性(滑轮滚动保持头部不动、暂无数据显示、元素隔开距离、带背景的文字效果、网页上禁止选中文字、校验值有效为绿色无效为红色、)

简单实用的CSS属性(滑轮滚动保持头部不动、暂无数据显示、元素隔开距离、带背景的文字效果、网页上禁止选中文字、校验值有效为绿色无效为红色、) 目录 一、滑轮滚动保持头部不动 二、暂无数据显示 三、元素隔开距离 四、带背景的文字效果 backgro…

9个相见恨晚的提升办公效率的网站!

推荐9个完全免费的神器网站,每一个都是功能强大,完全免费,良心好用,让你相见恨晚。 1:知犀思维导图 https://www.zhixi.com/ 知犀思维导图是一个完全免费的宝藏在线思维导图工具。它完全免费,界面简洁唯美…

二【单表的增删改查】(只演示增 )

目录1.1 前述1.2 结果映射resultMap1.2.1 字段名和属性名不匹配情况1.2.2 解决方法1.3 使用Insert 方法添加数据(涉及主键 问题)1.1 前述 MyBatis可以方便的对数据库进行操作,而数据库表可能是一个相对独立的表(这里谓之单表&…

2023年1月手机热门品牌型号排行榜(手机行业趋势分析)

近期苹果降价引起人们的关注,并且优惠较大,iPhone 14 Pro系列在苹果官方授权渠道均降价,线下授权门店普遍降价700元左右。iPhone Pro与Pro Max作为苹果的旗舰产品,通常被认为是更为保值的机型,一般来说,不会…

分布式数据库(DorisDB、Clickhouse、TiDB)调研

1. 性能功能特点 B站视频:DorisDB VS ClickHouse OLAP PK 1.1 DorisDB 场量:线上数据应用 访问官方网站DorisDB企业版文档 DorisDB是鼎石科技由Apache Doris核心研发团队打造的新一代企业级MPP数据库。它继承了Apache Doris项目十多年研发成果&…

vr汽修仿真实训教学整体方案软件专业定制

随着网络、多媒体、人机交互等技术的发展,传统的教学模式受到越来越大的挑战.其中,汽车专业教学矛盾较为突出。 传统的汽车专业教学通常采用以PPT、视频、音频等传统视听教学系统的理论教学和实训车间实际操作的实训教学.这种教学模式不仅不能引起学生的学习兴趣,同时需要大量实…

MybatisPlus使用聚合函数

前言 今天遇到了一个求总数返回的情况,我一想这不是用sum就完事了吗。 但是仔细想想,MybatisPlus好像没有直接使用sum的api。 虽然没有直接提供,但是办法还是有的,下面就分享下如何实现的: 首先如果使用sql是这么写…

【计算机网络期末复习】重点知识总复习

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址:https://blog.csdn.net/newin2020/cate…

tiktok达人带货,快码住!别错过高ROI达人!【超店有数】

众所周知,tiktok的快速发展带火了一大批的达人。这些达人在有了一定的粉丝基础后,通过营销,实现更多的变现。tiktok达人营销符合当下电商市场的发展需求,能够给电商市场带来积极的经济推动。小编建议商家们要善于利用tiktok达人带…

数据库迁移同步工具你选对了吗?

文章目录前言一、Navicat二、DataX二、TurboDX总结前言 之前在项目中,收到一个紧急需求,要把数据从 PostgreSQL 迁移到 TiDB 中。由于时间紧任务重,来不及调研高效的方式,直接使用了 Navicat 内置的功能,把数据从 Pos…

支付宝沙箱环境使用

第一步、开通支付宝开放平台账户 https://open.alipay.com/第二步、选择沙箱环境,按照官方文档操作即可 https://opendocs.alipay.com/common/02kkv7进入沙箱控制台 https://open.alipay.com/develop/sandbox/app第三步、配置接口的加密方式,选择自定义…

Modbus通信协议学习笔记

Modbus主从设备 主控设备(Modbus Master):工控机、PLC、触摸屏等等 从设备(Modbus Slave):PLC、Modbus采集模块、带485通讯的传感器、仪器仪表等等 Modbus物理接口:串口(RS232、RS4…

零信任-深信服零信任aTrust介绍(5)

​深信服零信任aTrust介绍 深信服是国内领先的互联网信任服务提供商,也是国内首家通过认证的全球信任服务商。深信服零信任是其中一项核心的信任技术,主要针对身份认证、数字签名、数字证书等方面的信任问题。 深信服零信任提供了一种新的安全保护模式…

【老王读Spring Transaction-5】Spring事务传播行为propagation behavior的实现原理

Spring事务传播行为propagation behavior的实现原理前言Spring 版本正文事务传播行为(propagation behavior)列举事务传播行为归类事务传播行为的实现原理小结前言 Spring 对事务的封装除了实现了基本的事务管理之外,还提供了事务传播行为(propagation behavior)的…