MySQL 聚合函数 + 窗口函数 数据分析完整版
一、核心区别先看懂
| 用法 | 是否合并行 | 适用场景 |
|---|---|---|
| 聚合函数 + GROUP BY | 合并多行,变少行 | 做报表、分组汇总 |
| 聚合函数 + OVER() 窗口 | 保留原每行数据 | 排名、占比、累计、同组对比、环比 |
常用可做窗口的聚合函数:
SUM、AVG、COUNT、MAX、MIN 全都能当窗口函数用。
二、窗口函数基础语法
聚合函数() OVER (
PARTITION BY 分组字段 -- 分区,相当于小GROUP BY
ORDER BY 排序字段 -- 区内排序
) AS 别名
PARTITION BY:分区,把数据分成若干组,各自单独计算ORDER BY:分区内排序,配合SUM可做累计统计
三、五大聚合函数 窗口实战(可直接复制运行)
先用一张业务表逻辑:订单表 order
字段:user_id, order_date, amount
1. SUM 窗口:累计求和、分组求和
1)全局累计销售额
SELECT
order_date,
amount,
SUM(amount) OVER(ORDER BY order_date) AS 累计销售额
FROM `order`;
2)按用户分组:每个人的累计消费
SELECT
user_id,
order_date,
amount,
SUM(amount) OVER(PARTITION BY user_id ORDER BY order_date) AS 个人累计消费
FROM `order`;
3)每行带出该用户总消费(不累计,整体总和)
SELECT
user_id,
amount,
SUM(amount) OVER(PARTITION BY user_id) AS 个人总消费
FROM `order`;
特点:同一个用户每一行,都显示这个人全部订单总和。
2. AVG 窗口:组内平均值
看每笔订单,对比自己用户的平均客单价
SELECT
user_id,
amount,
AVG(amount) OVER(PARTITION BY user_id) AS 个人平均订单金额
FROM `order`;
3. COUNT 窗口:组内计数
统计每个用户一共下了多少单,每一行都带出总数
SELECT
user_id,
amount,
COUNT(*) OVER(PARTITION BY user_id) AS 个人订单总数
FROM `order`;
4. MAX / MIN 窗口:组内最大最小值
每行带出:该用户最高单笔、最低单笔金额
SELECT
user_id,
amount,
MAX(amount) OVER(PARTITION BY user_id) AS 个人最大单笔,
MIN(amount) OVER(PARTITION BY user_id) AS 个人最小单笔
FROM `order`;
四、高阶业务分析:聚合窗口经典场景
场景1:计算每行数据占分组比例
公式:单行金额 / 个人总金额
SELECT
user_id,
amount,
SUM(amount) OVER(PARTITION BY user_id) AS 个人总额,
ROUND(amount / SUM(amount) OVER(PARTITION BY user_id) * 100,2) AS 单笔占比_百分比
FROM `order`;
场景2:同期对比 + 每行看全局均值
SELECT
order_date,
amount,
AVG(amount) OVER() AS 全局平均客单价,
AVG(amount) OVER(PARTITION BY order_date) AS 当日平均客单价
FROM `order`;
场景3:滚动窗口(近3日移动平均)
MySQL 8.0+ 支持行间范围,做趋势分析
SELECT
order_date,
amount,
AVG(amount) OVER(
ORDER BY order_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS 近3日移动均值
FROM `order`;

浙公网安备 33010602011771号