SQL 分析函数与聚合函数的组合应用

目标:掌握 SQL 中分析函数(窗口函数)与聚合函数的组合使用,通过实际案例实现复杂业务需求,如同比、环比和趋势分析。


1. 分析函数与聚合函数的区别

  • 聚合函数(Aggregate Functions) :对多行数据进行汇总,返回一个结果。常见的有 SUMAVGCOUNTMAX 等。
  • 分析函数(Analytic/Window Functions) :在不缩减行数的前提下,基于某个窗口执行计算。常见的有 SUM() OVERRANK()LEAD()LAG() 等。

2. 核心函数介绍

  • SUM() OVER:在特定窗口内累加数据,返回每一行对应窗口的累积值。
  • AVG() OVER:在窗口内计算平均值,常用于移动平均。
  • PERCENT_RANK():计算当前行在窗口内的百分比排名。

3. 案例:计算用户每月销售额及同比、环比增长率

需求描述
  1. 计算每个用户在每个月的总销售额。
  2. 计算每个月的环比增长率(本月与上月相比)。
  3. 计算每个月的同比增长率(本月与去年同月相比)。

示例数据

sales 表结构:

sale_id user_id sale_amount sale_date
1 101 500 2023-01-15
2 101 600 2023-02-10
3 101 700 2024-01-20
4 102 400 2023-01-18
5 102 450 2024-01-25

SQL 实现
sql 复制代码
WITH monthly_sales AS (
    SELECT 
        user_id,
        DATE_FORMAT(sale_date, '%Y-%m') AS sale_month,
        SUM(sale_amount) AS total_sales
    FROM sales
    GROUP BY user_id, DATE_FORMAT(sale_date, '%Y-%m')
),
sales_with_trends AS (
    SELECT 
        user_id,
        sale_month,
        total_sales,
        LAG(total_sales, 1) OVER (PARTITION BY user_id ORDER BY sale_month) AS previous_month_sales,
        LAG(total_sales, 12) OVER (PARTITION BY user_id ORDER BY sale_month) AS last_year_sales
    FROM monthly_sales
)
SELECT 
    user_id,
    sale_month,
    total_sales,
    ROUND(
        (total_sales - previous_month_sales) / NULLIF(previous_month_sales, 0) * 100, 2
    ) AS month_over_month_growth,
    ROUND(
        (total_sales - last_year_sales) / NULLIF(last_year_sales, 0) * 100, 2
    ) AS year_over_year_growth
FROM sales_with_trends
ORDER BY user_id, sale_month;

代码解析

  1. 第一步monthly_sales):按用户和月份汇总销售数据,计算每月销售总额。
  2. 第二步sales_with_trends):
    • 使用 LAG() 计算前一个月的销售额,计算环比。
    • 使用 LAG() 结合 12 个月偏移量计算去年的同月销售额,实现同比。
  3. 最终结果 :计算环比、同比增长率,NULLIF 防止除零错误。

结果示例

user_id sale_month total_sales month_over_month_growth year_over_year_growth
101 2023-01 500 NULL NULL
101 2023-02 600 20.00 NULL
101 2024-01 700 16.67 40.00

4. 亮点解读

  • 环比计算 :通过 LAG() 直接获取上个月数据,无需自联表。
  • 同比计算 :利用 LAG() 向前偏移12个月,直观且高效。
  • 窗口函数优势:保留所有行数据,且在不改变原始行的基础上计算额外指标。

5. 扩展思考

  • 可以使用 LEAD() 预测未来趋势或计算未来一个月的数据变化。
  • 结合 PERCENT_RANK() 分析各用户在销售额中的排名,实现销售精英筛选。
  • 使用 NTILE(4) 将用户按季度或销售额分组,分析不同等级用户的增长趋势。

这种 SQL 方案适合在业务系统中监控用户销售趋势,适用于电商、金融和 SaaS 产品的业务数据分析。

相关推荐
两点王爷4 分钟前
PostgreSQL 好用又独特的特性与空间函数
数据库
梦帮科技7 分钟前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
RoboWizard1 小时前
三星和金士顿内存条哪个更适合游戏超频
大数据·人工智能
深圳市恒星物联科技有限公司1 小时前
轻量MCU设备通过OpenHarmony兼容性测评的全流程关键要点与实战踩坑经验
大数据·人工智能·物联网·鸿蒙
TDengine (老段)2 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Lucifer三思而后行3 小时前
Oracle SQL 优化实战:明明走了索引,SQL 还是慢?
sql·oracle
Leo.yuan3 小时前
盘点2026十大主流国产数据仓库软件:从开源到商业,企业级怎么选?
大数据
长谷深风1113 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
螺蛳粉 螺蛳粉4 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
大大大大晴天5 小时前
元数据之后,数据治理该做什么:标准、指标与主数据
大数据