MySQL窗口函数入门指南

假设有一个名为Employee的表,它有以下的结构:

CREATE TABLE Employee (ID INT PRIMARY KEY,Name VARCHAR(50),Department VARCHAR(50),Salary DECIMAL(10, 2)
);

这个表有四个字段:ID(员工的唯一标识符),Name(员工的名字),Department(员工所在的部门),Salary(员工的工资)。
现在,让我们使用这个表来学习窗口函数的基本用法,窗口函数是mysql进阶必须掌握的。

目录

  • 窗口函数详解
  • 窗口函数实战
    • 力扣185. 部门工资前三高的所有员工

窗口函数详解

1. 什么是窗口函数?

窗口函数是MySQL 8.0新增的一个重要功能,可以为数据分析提供强大的支持,例如计算分组排名、累积求和、同比/环比增长率等。

2. 窗口函数的基本语法

窗口函数的定义如下:

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

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

例如,以下的查询返回每个部门的平均工资:

SELECT Department, AVG(Salary) OVER (PARTITION BY Department) as AvgSalary
FROM Employee;

3. 分区选项(PARTITION BY)

PARTITION BY选项用于将数据行拆分成多个分区(组),窗口函数基于每一行数据所在的组进行计算并返回结果,它的作用类似于GROUP BY分组。
例如,以下的查询返回每个部门每个员工的工资以及他们所在部门的平均工资:

SELECT Department, Salary, AVG(Salary) OVER (PARTITION BY Department) as AvgSalary
FROM Employee;

4. 排序选项(ORDER BY)

OVER子句中的ORDER BY选项用于指定分区内的排序方式,与ORDER BY子句的作用类似,通常用于数据的排名分析。

例如,以下的查询返回每个部门每个员工的工资以及他们在部门内的工资排名:

SELECT Department, Salary, RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) as Rank
FROM Employee;

5. 窗口选项(frame_clause)

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

例如,以下的查询返回每个部门每个员工的工资以及他们在部门内的累积工资(从部门工资最低的员工开始,一直累加到当前员工的工资):

SELECT Department, Salary, SUM(Salary) OVER (PARTITION BY Department ORDER BY Salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as CumulativeSalary
FROM Employee;

解释一下这段语句:

frame_clause是窗口函数的一个选项,用于在当前分区内指定一个计算窗口,也就是一个与当前行相关的数据子集。在这个查询中,frame_clauseROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW定义了一个窗口,这个窗口从分区的第一行开始,到当前行结束。UNBOUNDED PRECEDING表示窗口的开始没有限制,始终从分区的第一行开始;CURRENT ROW表示窗口的结束是当前行。

然后,ORDER BY Salary是用来指定分区内的排序方式的。在这个查询中,我们按照工资的大小对每个部门的员工进行排序。这样,当我们计算累积工资时,就可以确保我们是按照工资的顺序进行累加的。

frame_clause可以有以下几种形式,这里做一些简单的举例:

ROWS UNBOUNDED PRECEDING:窗口从分区的第一行开始,到当前行结束。
ROWS N PRECEDING:窗口从当前行的前N行开始,到当前行结束。
ROWS CURRENT ROW:窗口只包含当前行。
ROWS N FOLLOWING:窗口从当前行开始,到当前行的后N行结束。
ROWS UNBOUNDED FOLLOWING:窗口从当前行开始,到分区的最后一行结束。
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:窗口从分区的第一行开始,到当前行结束。
ROWS BETWEEN N PRECEDING AND M FOLLOWING:窗口从当前行的前N行开始,到当前行的后M行结束。

6. 常用的窗口函数

RANK(): 计算分区内的排名,无参数。
DENSE_RANK(): 计算分区内的排名,无参数,但在计算排名时会忽略并列的情况,即相同的值是同一个排名。
ROW_NUMBER(): 返回分区内的行号,无参数,即使值相同,行号也会递增。

例如,以下的查询返回每个部门每个员工的工资以及他们在部门内的工资排名(使用RANK()和DENSE_RANK()):

SELECT Department, Salary, RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) as Rank, DENSE_RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) as DenseRank
FROM Employee;

MySQL还支持以下的窗口函数:

LEAD(expr, offset, default): 返回按照某种排序顺序的下一行的值。
expr是要返回的列或表达式,offset是向前的行数(默认为1),default是在没有足够的行时返回的值(默认为NULL)。LAG(expr, offset, default): 返回按照某种排序顺序的上一行的值。
expr是要返回的列或表达式,offset是向后的行数(默认为1),default是在没有足够的行时返回的值(默认为NULL)。FIRST_VALUE(expr): 返回按照某种排序顺序的第一行的值。expr是要返回的列或表达式。LAST_VALUE(expr): 返回按照某种排序顺序的最后一行的值。expr是要返回的列或表达式。NTH_VALUE(expr, N): 返回按照某种排序顺序的第N行的值。
expr是要返回的列或表达式,N是行数。NTILE(N): 将排序后的行分成N个组,并返回每一行所在的组。PERCENT_RANK(): 返回每一行的百分比排名。无参数。CUME_DIST(): 返回小于等于当前行的值的比例。无参数

这些函数都可以用在OVER子句中,和RANK(), DENSE_RANK(), ROW_NUMBER()一样,可以用来进行复杂的数据分析。更多指南详见myqsl窗口函数官方手册。






窗口函数实战

下面记录一些sql算法题中使用到窗口函数时楼主的通过代码,不定时更新。

力扣185. 部门工资前三高的所有员工

力扣185. 部门工资前三高的所有员工

# 使用窗口函数 给Employee表增加一个字段 即该员工的工资在其部门的排名 因为两个相同的工资算同一名 所以要选择DENSE_RANK()
select t2.name Department, t1.name Employee ,t1.salary from
(select * , DENSE_RANK() OVER (PARTITION BY departmentId ORDER BY salary desc) ranking # 这里的列名别名不能写成rank 因为其是mysql的保留关键字
from Employee ) t1
left join Department t2
on t1.departmentId = t2.id
where t1.ranking <= 3

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

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

相关文章

《掌握需求管理,助你打造火爆产品》

作为一名产品经理&#xff0c;需求管理是你工作中最重要的部分之一。一个好的需求管理系统可以帮助你确保你的产品始终符合客户的需求和期望&#xff0c;并确保项目能够按时交付。下面是一些建议&#xff0c;帮助你成为一个更好的需求管理者。 建立清晰的需求管理流程 一个好的…

一文详解Cookie以及Selenium自动获取Cookie

前言 以后数据获取途径以及数据资产绝对会是未来核心要素生产工具和资源之一&#xff0c;每个大模型都离不开更加精细化数据的二次喂养训练。不过现在来看收集大量数据的方法还是有很多途径的&#xff0c;有些垂直领域的专业数据是很难获取得到的&#xff0c;靠人力去搜寻相当…

Arduino stm32 USB CDC虚拟串口使用示例

Arduino stm32 USB CDC虚拟串口使用示例 &#x1f4cd;相关篇《STM32F401RCT6基于Arduino框架点灯程序》&#x1f516;本开发环境基于VSCode PIO&#x1f33f;验证芯片&#xff1a;STM32F401RC⌛USB CDC引脚&#xff1a; PA11、 PA12&#x1f527;platformio.ini配置信息&…

1221. 分割平衡字符串 23.12.11(一)补

平衡字符串 中&#xff0c;L 和 R 字符的数量是相同的。 给你一个平衡字符串 s&#xff0c;请你将它分割成尽可能多的子字符串&#xff0c;并满足&#xff1a; 每个子字符串都是平衡字符串。 返回可以通过分割得到的平衡字符串的 最大数量 。 示例 1&#xff1a; 输入&…

【滑动窗口】【二分查找】C++算法:和至少为 K 的最短子数组

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 有序向量 二分查找 LeetCode862:和至少为 K 的最短子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;找出 nums 中和至少为 k 的 最短非空子数组 &#xff0c;并返回…

HCIA-Datacom题库(自己整理分类的)——ARP协议【完】

一、单选 1.ARP 属于哪一层协议&#xff1f; 数据链路层 网络层 物理层 传输层 2.ARP请求是____发送的 点播 广播 组播 单播 关于ARP报文的说法错误的是? ARP请求报文是广播发送的 ARP报文不能被转发到其他广播域 ARP应答报文是单播方发送的 任何链路层协议都需…

开放式蓝牙耳机学生党适合买哪些?平价好用的开放式耳机推荐

对于学生党来说&#xff0c;想要买一款既平价又好用的开放式蓝牙耳机&#xff0c;确实需要仔细挑选&#xff0c;那啥是开放式耳机呢&#xff1f;简单来说&#xff0c;开放式耳机就是那种不把耳朵全部封闭起来的耳机&#xff0c;声音可以流通&#xff0c;听起来更自然、舒适&…

LVM与磁盘配额

文章目录 LVM与磁盘配额一、LVM概述1、LVM概述2、LVM机制的基本概念2.1 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09;2.2 VG&#xff08;Logical Volume&#xff0c;逻辑卷&#xff09;2.3 LV&#xff08;Logical Volume&#xff0c;逻辑卷&#xff09; 二、L…

Android移动端超分辨率调研(未完成 目前自用)

作用 图片加载是目前几乎所有的APP都具备的基础能力&#xff0c;在节省服务商的传输带宽之外&#xff0c;也可以降低用户消费端流量的消耗&#xff0c;提升用户的加载速度。帮助每一个产品用更低的成本达到更好的图片加载效果。 效果 另一方面 用TensorFlow实现的图像极度压…

Nginx配置反向代理

代理通常用于在多个服务器之间分配负载&#xff0c;无缝显示来自不同网站的内容&#xff0c;或通过 HTTP 以外的协议将处理请求传递给应用程序服务器。 将请求传递到代理服务器 当 NGINX 代理请求时&#xff0c;它会将请求发送到指定的代理服务器&#xff0c;获取响应&#x…

大语言模型发展史

前言 2023年可谓是生成式AI元年&#xff0c;大语言模型从崭露头角到锋芒毕露&#xff0c;已然成为人工智能领域的关键推动力。这一创新性的技术不仅在自然语言处理领域崭露头角&#xff0c;更深刻地改变了我们对人机交互、智能助手和信息处理的认知。那么大语言模型的发展历程…

Vue开发中常见的问题及解决方案

Vue.js 是一个流行的前端 JavaScript 框架&#xff0c;用于构建用户界面和单页应用程序。就像使用任何框架一样&#xff0c;开发者在使用 Vue.js 时也可能会遇到一系列的挑战。以下是一些 Vue 开发中常见的问题及其解决方案&#xff1a; 1. 组件状态管理 问题: 在复杂的应用中…

HarmonyOS云开发基础认证【题库答案】

HarmonyOS应用开发者基础认证【题库答案】 HarmonyOS应用开发者高级认证【题库答案】 一、判断题 应用架构的演进依次经历了微服务架构、单体架构、Serverless架构等阶段。&#xff08;错&#xff09;鸿蒙应用可以使用Arkts开发&#xff08;对&#xff09;认证服务在绑定微信账…

Math、System、Runtime

Math 代表数学&#xff0c;是一个工具类&#xff0c;里面提供的都是对数据进行操作的一些静态方法。 Math类提供的常见方法 方法名说明public static int abs&#xff08;int a&#xff09;获取参数绝对值public static double ceil&#xff08;double a&#xff09;向上取整…

如何使用ArcGIS Pro自动矢量化建筑

相信你在使用ArcGIS Pro的时候已经发现了一个问题&#xff0c;那就是ArcGIS Pro没有ArcScan&#xff0c;在ArcGIS Pro中&#xff0c;Esri确实已经移除了ArcScan&#xff0c;没有了ArcScan我们如何自动矢量化地图&#xff0c;从地图中提取建筑等要素呢&#xff0c;这里为大家介绍…

基于 eBPF 构建下一代智能可观测系统

作者&#xff1a;梵登、千陆 本文基于 KubeCon China 2023 分享整理 我们今天分享的主题是基于 eBPF 构建下一代智能可观测系统。 在开始之前呢&#xff0c;我先介绍一下我们自己。我是刘恺&#xff0c;花名是千陆&#xff0c;目前是阿里云 ARMS K8s 监控子产品的负责人。这…

UWB高精度人员定位系统源码,全方位护航安全生产

定位管理系统使用UWB定位技术&#xff0c;通过在厂区安装定位基站&#xff0c;为人员或设备佩戴定位标签的形式&#xff0c;实现人员精准实时定位。可以实现人员、车辆物资实时定位、工作考勤、电子围栏、历史轨迹回放、巡检巡查、物资盘点、路径规划、三维显示等&#xff0c;以…

NLP 自然语言处理实战

自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法&#xff0c;用于分析理解机器与人之间的交互&#xff0c;常用的领域有&#xff1a;实体识别、文本纠错…

Conda:Python环境管理的瑞士军刀

在数据科学和机器学习的世界中&#xff0c;管理各种库和依赖关系的重要性不容忽视。Conda 就是为此而生的强大工具。本文将深入探讨 Conda 的简介、功能以及使用示例&#xff0c;帮助你更好地理解和使用这个工具。 Conda 简介 Conda 是一个开源的包管理系统和环境管理系统&am…

惟客数据昆仑-开发云成功开源了!让研发更简单高效

​近期&#xff0c;WakeData惟客数据产品——昆仑-开发云成功开源。 今年4月&#xff0c;惟客数据完成了新一轮产品能力升级&#xff0c;与战略伙伴联合研发具有私有化部署能力的行业大模型 WakeMind 。 昆仑-开发云在可视化领域建模的基础上也引入了 WakeMind 的能力&#x…