MySQL开窗函数种类和使用总结

在 MySQL 中,开窗函数(Window Functions) 是一种强大的功能,能够在数据分析和聚合时提供灵活的方式。开窗函数在 MySQL 8.0 及以上版本 中引入,可以基于数据的某个分组(窗口)来执行计算,而不会像 GROUP BY 那样将数据汇总为一行。


常用的开窗函数

开窗函数主要分为以下几类:

1. 聚合类函数

这些函数通常用于计算分组的聚合值,但在开窗函数中,聚合值会应用于窗口的每一行:

  • SUM()
  • AVG()
  • MAX()
  • MIN()
  • COUNT()
2. 排序相关函数

这些函数用于返回行的排序信息:

  • ROW_NUMBER():窗口内的行号,从 1 开始。1,2,3,4,5,6
  • RANK():窗口内的排名,排名相同的行会有相同的 rank,下一名会跳过。1,2,2,2,5,6
  • DENSE_RANK():类似 RANK(),但排名不会跳过。1,2,2,2,3,4
  • NTILE(n):将行分为 n 个桶,返回当前行属于哪个桶。1,1,1,1,2,2,2,3,3,3,4,4,4,4, NTILE 分桶什么意思
3. 值偏移类函数

这些函数用于返回窗口内的相对值:

  • LAG(column, offset, default):返回当前行之前第 offset 行的值。
  • LEAD(column, offset, default):返回当前行之后第 offset 行的值。
  • FIRST_VALUE(column):返回窗口内的第一行值。
  • LAST_VALUE(column):返回窗口内的最后一行值。
  • NTH_VALUE(column, n):返回窗口内第 n 行的值。

基本语法

<函数>(<列名>) OVER ( [PARTITION BY <分组列>] [ORDER BY <排序列>] [<窗口范围>] ) 
  • PARTITION BY:将数据按指定列分组,类似于 GROUP BY,但不会合并成一行。
  • ORDER BY:指定窗口内的排序方式。
  • 窗口范围:通过 ROWSRANGE 定义窗口的大小。
    • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:从窗口的第一行到当前行。
    • ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING:从当前行到窗口的最后一行。

示例

1. 计算每个部门的员工薪资排名
SELECT department_id, employee_id, salary
, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank 
FROM employees; 
  • 解释:按照部门(department_id)对员工(employee_id)进行分组,并根据薪资降序排序,计算薪资排名。

2. 累计薪资计算
SELECT department_id, employee_id, salary
, SUM(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS cumulative_salary 
FROM employees; 
  • 解释:按部门分组,按照员工 ID 排序,计算每个员工的累计薪资。

3. 获取前一行和后一行的薪资差异
SELECT employee_id, salary
, LAG(salary) OVER (ORDER BY salary) AS previous_salary
, LEAD(salary) OVER (ORDER BY salary) AS next_salary
, salary - LAG(salary) OVER (ORDER BY salary) AS salary_difference 
FROM employees; 
  • 解释
    • LAG(salary) 获取前一行的薪资。
    • LEAD(salary) 获取后一行的薪资。
    • 计算当前行与前一行薪资的差异。

4. 统计窗口的最大值和最小值
SELECT employee_id, salary
, MAX(salary) OVER (PARTITION BY department_id) AS max_salary_in_department
, MIN(salary) OVER (PARTITION BY department_id) AS min_salary_in_department 
FROM employees; 
  • 解释:按部门分组,分别计算部门内薪资的最大值和最小值。

5. 分组求 TOP N 的行
WITH RankedSalaries AS ( SELECT department_id, employee_id, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank FROM employees 
) 
SELECT department_id, employee_id, salary 
FROM RankedSalaries 
WHERE rank <= 3; 
  • 解释:使用 ROW_NUMBER() 按部门和薪资排名,再过滤出每个部门的前三名。

窗口范围的示例

SELECT employee_id, salary
, SUM(salary) OVER (ORDER BY salary ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_sum 
FROM employees; 
  • 解释:计算当前行及前两行的移动总和,这个方法用于滚动计算的实践应用极好,有时候会有这类需求,滚动求和,滚动count.

注意事项

  1. MySQL 版本:开窗函数需要 MySQL 8.0 或更高版本,在旧版本中不可用。
  2. 性能优化:开窗函数可能会增加查询的计算量,需注意索引的使用和优化 SQL 查询。
  3. 窗口范围:默认窗口范围是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,需要根据需求调整。
  4. Hive 里面的窗口函数跟MySQL 非常相似,可以拿来就用。

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

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

相关文章

电商平台的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统商品交易信息管理难度大&#xff0c;容错率低&#xff0…

【deepseek实战】绿色好用,不断网

前言 最佳deepseek火热网络&#xff0c;我也开发一款windows的电脑端&#xff0c;接入了deepseek&#xff0c;基本是复刻了网页端&#xff0c;还加入一些特色功能。 助力国内AI&#xff0c;发出自己的热量 说一下开发过程和内容的使用吧。 目录 一、介绍 二、具体工作 1.1、引…

【OS】AUTOSAR架构下的Interrupt详解(上篇)

目录 前言 正文 1.中断概念分析 1.1 中断处理API 1.2 中断级别 1.3 中断向量表 1.4 二类中断的嵌套 1.4.1概述 1.4.2激活 1.5一类中断 1.5.1一类中断的实现 1.5.2一类中断的嵌套 1.5.3在StartOS之前的1类ISR 1.5.4使用1类中断时的注意事项 1.6中断源的初始化 1.…

llama.cpp GGUF 模型格式

llama.cpp GGUF 模型格式 1. Specification1.1. GGUF Naming Convention (命名规则)1.1.1. Validating Above Naming Convention 1.2. File Structure 2. Standardized key-value pairs2.1. General2.1.1. Required2.1.2. General metadata2.1.3. Source metadata 2.2. LLM2.2.…

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) &#xff1a;将xxx.pt模型转化成 xxx.onnx ONNX&#xff08;Ope…

快速上手——.net封装使用DeekSeek-V3 模型

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?开工大吉 新的一年就这么水灵灵的开始了,在这里,祝各位读者新春快乐,万事如意! 新年伊…

【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0

根据Oracle官方产品经理的博客&#xff0c;Oracle于2024年12月20日正式对外发布了WebLogic 14c的第二个正式版本&#xff0c;版本号为 14.1.2.0.0 &#xff0c;目前官方已开放客户端下载。该版本除继续支持 Jakarta EE 8 版本外&#xff0c;还增加了对 Java SE 17&#xff08;J…

Spider 数据集上实现nlp2sql训练任务

NLP2SQL&#xff08;自然语言处理到 SQL 查询的转换&#xff09;是一个重要的自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;其目标是将用户的自然语言问题转换为相应的 SQL 查询。这一任务在许多场景下具有广泛的应用&#xff0c;尤其是在与数据库交互的场景中&…

IDEA+DeepSeek让Java开发起飞

1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台&#xff0c;第一次需要注册一个账号 进去之后需要创建一个API KEY&#xff0c;然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址&#xff0c;点击左边的&#xff1a;接口…

intra-mart实现简易登录页面笔记

一、前言 最近在学习intra-mart框架&#xff0c;在此总结下笔记。 intra-mart是一个前后端不分离的框架&#xff0c;开发时主要用的就是xml、html、js这几个文件&#xff1b; xml文件当做配置文件&#xff0c;html当做前端页面文件&#xff0c;js当做后端文件&#xff08;js里…

Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】

&#x1f380;&#x1f380;Shell语法入门篇 系列篇 &#x1f380;&#x1f380; LinuxDocer 容器化部署之 Shell 语法入门篇 【准备阶段】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell变量】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell数组与函数】LinuxDocer 容…

Intellij IDEA如何查看当前文件的类

快捷键&#xff1a;CtrlF12&#xff0c;我个人感觉记快捷键很麻烦&#xff0c;知道具体的位置更简单&#xff0c;如果忘了快捷键&#xff08;KeyMap&#xff09;看一下就记起来了&#xff0c;不需要再Google or Baidu or GPT啥的&#xff0c;位置&#xff1a;Navigate > Fi…

C++----继承

一、继承的基本概念 本质&#xff1a;代码复用类关系建模&#xff08;是多态的基础&#xff09; class Person { /*...*/ }; class Student : public Person { /*...*/ }; // public继承 派生类继承基类成员&#xff08;数据方法&#xff09;&#xff0c;可以通过监视窗口检…

2025.2.5——五、[网鼎杯 2020 青龙组]AreUSerialz 代码审计|反序列化

题目来源&#xff1a;BUUCTF [网鼎杯 2020 青龙组]AreUSerialz 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;代码审计 step 2&#xff1a;开始解题 突破protected访问修饰符限制 三、小结 一、打开靶机&#xff0c;整理信息 直接得到一串ph…

Docker深度解析:安装各大环境

安装 Nginx 实现负载均衡&#xff1a; 挂载 nginx html 文件&#xff1a; 创建过载目录&#xff1a; mkdir -p /data/nginx/{conf,conf.d,html,logs} 注意&#xff1a;在挂载前需要对 conf/nginx.conf 文件进行编写 worker_processes 1;events {worker_connections 1024; …

基于SpringBoot养老院平台系统功能实现五

一、前言介绍&#xff1a; 1.1 项目摘要 随着全球人口老龄化的不断加剧&#xff0c;养老服务需求日益增长。特别是在中国&#xff0c;随着经济的快速发展和人民生活水平的提高&#xff0c;老年人口数量不断增加&#xff0c;对养老服务的质量和效率提出了更高的要求。传统的养…

【AIGC魔童】DeepSeek v3推理部署:vLLM/SGLang/LMDeploy

【AIGC魔童】DeepSeek v3推理部署&#xff1a;vLLM/SGLang/LMDeploy &#xff08;1&#xff09;使用vLLM推理部署DeepSeek&#xff08;2&#xff09;使用SGLang推理部署DeepSeek&#xff08;3&#xff09;使用LMDeploy推理部署DeepSeek &#xff08;1&#xff09;使用vLLM推理部…

C语言的灵魂——指针(2)

前言&#xff1a;上期我们介绍了如何理解地址&#xff0c;内存&#xff0c;以及指针的一些基础知识和运算&#xff1b;这期我们来介绍一下const修饰指针&#xff0c;野指针&#xff0c;assert断言&#xff0c;指针的传址调用。 上一篇指针&#xff08;1&#xff09; 文章目录 一…

Android studio 创建aar包给Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么区别 aar 和 jar包 都是压缩包&#xff0c;可以使用压缩软件打开 jar包 用于封装 Java 类及其相关资源 aar 文件是专门为 Android 平台设计的 &#xff0c;可以包含Android的专有内容&#xff0c;比如AndroidManifest.xml 文件 &#…