MySQL窗口函数深度解析
前言
在数据处理和分析场景中,我们常常需要对数据进行分组计算、排名统计、累计求和等操作。传统的聚合函数虽然能满足部分需求,但在处理涉及组内顺序和对比的复杂计算时,往往显得力不从心。MySQL 窗口函数的出现,为这类问题提供了高效且优雅的解决方案。本文我将深入探讨 MySQL 窗口函数的原理、语法、常用函数及实际应用场景,帮助你全面掌握这一强大的数据处理工具。
一、窗口函数基础概念
1.1 什么是窗口函数
窗口函数(Window Function),也称为分析函数,它可以在不改变原有数据行数的情况下,对结果集进行分组内的计算和分析。与普通聚合函数(如SUM、AVG)不同,窗口函数不会将多行数据聚合为一行,而是为每一行数据返回一个计算结果,这些结果基于定义的 “窗口”(即数据子集)进行计算。
1.2 窗口函数的语法结构
窗口函数的基本语法如下:
<窗口函数> OVER (PARTITION BY
<分组列> ORDER BY
<排序列> ROWS
BETWEEN <窗口起始位置>
AND <窗口结束位置>)
窗口函数:可以是专用窗口函数(如ROW_NUMBER()、RANK()、DENSE_RANK()等),也可以是聚合函数(如SUM()、AVG()、COUNT()等)。
OVER关键字:标志着窗口函数的开始,用于定义窗口的范围和计算规则。
PARTITION BY子句:指定分组依据,将数据划分为不同的组,窗口函数将在每个组内分别进行计算。如果省略该子句,则将整个结果集视为一个组。
ORDER BY子句:定义组内数据的排序顺序,影响窗口函数的计算逻辑。例如,在计算累计和时,数据的排序顺序决定了累加的顺序。
ROWS BETWEEN子句:用于定义窗口的范围,即参与计算的数据行区间。常见的取值有:
UNBOUNDED PRECEDING:表示从窗口起始行(第一行)开始。
CURRENT ROW:表示当前行。
UNBOUNDED FOLLOWING:表示到窗口结束行(最后一行)结束。
也可以指定具体的偏移量,如ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING表示当前行及其前一行和后一行。
二、常用窗口函数详解
2.1 排名函数
ROW_NUMBER()
ROW_NUMBER()函数为每一行数据生成一个唯一的连续序号,序号从 1 开始,按照ORDER BY指定的顺序依次递增。常用于分页查询、生成行号等场景。
SELECT
order_id,
order_date,
ROW_NUMBER() OVER (ORDER BY order_date) AS row_num
FROM
orders;
上述查询结果中,row_num列会根据order_date的升序排列,为每一行订单数据生成一个行号。
RANK()
RANK()函数用于对数据进行排名,相同值的行具有相同的排名,但排名会出现跳跃。例如,若有两个第一名,则下一个排名为第三名。
SELECT
product_id,
product_name,
price,
RANK()

最低0.47元/天 解锁文章
815

被折叠的 条评论
为什么被折叠?



