MySQL开窗函数种类和使用总结
在 MySQL 中,开窗函数(Window Functions) 是一种强大的功能,能够在数据分析和聚合时提供灵活的方式。开窗函数在 MySQL 8.0 及以上版本 中引入,可以基于数据的某个分组(窗口)来执行计算,而不会像 GROUP BY 那样将数据汇总为一行。
常用的开窗函数
开窗函数主要分为以下几类:
1. 聚合类函数
这些函数通常用于计算分组的聚合值,但在开窗函数中,聚合值会应用于窗口的每一行:
SUM()AVG()MAX()MIN()COUNT()
2. 排序相关函数
这些函数用于返回行的排序信息:
ROW_NUMBER():窗口内的行号,从 1 开始。1,2,3,4,5,6RANK():窗口内的排名,排名相同的行会有相同的 rank,下一名会跳过。1,2,2,2,5,6DENSE_RANK():类似RANK(),但排名不会跳过。1,2,2,2,3,4NTILE(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:指定窗口内的排序方式。- 窗口范围:通过
ROWS或RANGE定义窗口的大小。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.
注意事项
- MySQL 版本:开窗函数需要 MySQL 8.0 或更高版本,在旧版本中不可用。
- 性能优化:开窗函数可能会增加查询的计算量,需注意索引的使用和优化 SQL 查询。
- 窗口范围:默认窗口范围是
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,需要根据需求调整。 - Hive 里面的窗口函数跟MySQL 非常相似,可以拿来就用。
相关文章:
MySQL开窗函数种类和使用总结
在 MySQL 中,开窗函数(Window Functions) 是一种强大的功能,能够在数据分析和聚合时提供灵活的方式。开窗函数在 MySQL 8.0 及以上版本 中引入,可以基于数据的某个分组(窗口)来执行计算…...
DeepSeek——DeepSeek模型部署实战
摘要 文章主要介绍了DeepSeek大模型的本地部署方法、使用方式以及API接入相关内容。首先指出可通过下载Ollama来部署DeepSeek-R1模型,并给出了模型不同参数版本及存储信息。接着说明了如何通过Chatbox官网下载并接入DeepSeek API,以及如何接入本地部署模…...
zsh: command not found: pip
当你在终端输入 pip install ipykernel 时出现 zsh: command not found: pip 错误,这表明系统无法找到 pip 命令,下面为你详细分析可能的原因以及对应的解决办法。 可能的原因 Python 未安装:pip 是 Python 的包管理工具,若你的…...
机器学习数学基础:16.方程组
一、方程组基础概念 (一)定义 方程组是由若干个包含未知数的方程组合而成的集合。例如, { 3 x 2 y − z 7 2 x − y 3 z 5 x 4 y − 2 z 3 \begin{cases}3x 2y - z 7\\2x - y 3z 5\\x 4y - 2z 3\end{cases} ⎩ ⎨ ⎧3x2y−z7…...
即梦(Dreamina)技术浅析(四):生成对抗网络
即梦(Dreamina) 的生成对抗网络(GAN,Generative Adversarial Network)技术是其核心功能之一,用于生成高质量的图像、文本和视频内容。GAN 是一种深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成,通过对抗训练的方式不断提升生成内容的质量。 …...
2025年软件测试五大趋势:AI、API安全、云测试等前沿实践
随着软件开发的不断进步,测试方法也在演变。企业需要紧跟新兴趋势,以提升软件质量、提高测试效率,并确保安全性,在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...
Vue混入(Mixins)与插件开发深度解析
Vue混入(Mixins)与插件开发深度解析 Vue混入(Mixins)与插件开发深度解析1. Vue混入(Mixins)核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…...
【C++】C++11
目录 C11简介 统一的列表初始化 {}初始化 std::initializer_list 声明 auto decltype nullptr 范围for循环 智能指针 STL中的一些变化 右值引用和移动语义 左值引用和右值引用 右值引用的意义 完美转发 lambda表达式 新的类功能 可变参数模版 包装器 func…...
k8sollama部署deepseek-R1模型,内网无坑
这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…...
mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制
在 MySQL 8 的 C 源码中,表的最大字段数量限制体现在 MAX_FIELDS 宏定义中。这个宏定义了表中可以拥有的最大字段数量。 代码中的体现 在 mysql_prepare_create_table 函数中,有以下代码段检查表的字段数量是否超过最大限制: cpp if (alt…...
胜任力冰山模型:深入探索职业能力的多维结构
目录 1、序言 2、什么是胜任力? 3、任职资格和胜任力的区别 4、胜任力冰山模型:职场能力的多维展现 4.1、冰山水面上的部分 4.2、冰山水面下的部分 4.3、深层的个人特质与价值观 5、如何平衡任职资格与胜任能力 6、结语 1、序言 在快速发展的I…...
什么是三层交换技术?与二层有什么区别?
什么是三层交换技术?让你的网络飞起来! 一. 什么是三层交换技术?二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都在歌唱 大家好…...
Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】
🎀🎀Shell语法入门篇 系列篇 🎀🎀 LinuxDocer 容器化部署之 Shell 语法入门篇 【准备阶段】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell变量】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell数组与函数】LinuxDocer 容…...
DeepSeek LLM(初代)阅读报告
概况 这个是deepseek发布的第一版模型对应的技术报告,模型发布于23年11月,本报告发布于24年1月。 模型有7B和67B两个版本。 虽然本报告中还没有用上后面V2/V3和R1中的关键技术例如MLA、MTP、GRPO,但是报告中已经指明了MoE、强化学习等未来…...
JAVA异步的TCP 通讯-服务端
一、服务端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.Completion…...
高效协同,Tita 助力项目管理场景革新
在当今快节奏、高度竞争的商业环境中,企业面临着前所未有的挑战:如何在有限资源下迅速响应市场变化,确保多个项目的高效执行并达成战略目标?答案就在于优化项目集程管理。而在这个过程中,Tita项目管理产品以其独特的优…...
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧 (1)基础通用公式(适用80%场景)(2)问题解决公式(决策支持)(3)创意生成公式(4)学习提升公…...
Vue | 透传 Attributes(非 prop 的 attribute )
文章目录 引言I Attribute 继承II 禁用 attribute 继承禁用 attribute 继承的常见场景通过将 inheritAttrs 选项设置为 false从 3.3 开始可在 `<script setup>` 中使用defineOptions例子引言 “透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emi…...
启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全
2月7日,启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF(Model Application Firewall)大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…...
Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践
Vuex 是 Vue.js 中的状态管理模式,广泛应用于 Vue 2 和 Vue 3 中,其内部实现存在一些差异。 1. 什么是 Vuex ? Vuex 是 Vue.js 官方提供的状态管理库,用于集中管理应用的所有组件的状态。主要是通过一种集中化的方式来管理共享状…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
