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`;

posted @ 2026-05-14 21:28  小帅记事  阅读(8)  评论(0)    收藏  举报