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_iduser_idsale_amountsale_date
11015002023-01-15
21016002023-02-10
31017002024-01-20
41024002023-01-18
51024502024-01-25

SQL 实现
WITH monthly_sales AS (SELECT user_id,DATE_FORMAT(sale_date, '%Y-%m') AS sale_month,SUM(sale_amount) AS total_salesFROM salesGROUP 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_salesFROM 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_idsale_monthtotal_salesmonth_over_month_growthyear_over_year_growth
1012023-01500NULLNULL
1012023-0260020.00NULL
1012024-0170016.6740.00

4. 亮点解读

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

5. 扩展思考

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录:http://192.168.31.135:8086,首次登录设置用户名密码:admin/admin1…

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(四)

慢查询日志,顾名思义,就是查询慢的日志,是指mysql记录所有执行超过long_query_time(默认的时间10秒)参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是…

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…

MT8788安卓核心板_MTK8788核心板参数_联发科模块定制开发

MT8788安卓核心板是一款尺寸为52.5mm x 38.5mm x 2.95mm的高集成度电路板,专为各种智能设备应用而设计。该板卡整合了处理器、图形处理单元(GPU)、LPDDR3内存、eMMC存储及电源管理模块,具备出色的性能与低功耗特性。 这款核心板搭载了联发科的MT8788处理…

Linux实验报告14-Linux内存管理实验

目录 一:实验目的 二:实验内容 1、编辑模块的源代码mm_viraddr.c 2、编译模块 3、编写测试程序mm_test.c 4、编译测试程序mm_test.c 5、在后台运行mm_test 6、验证mm_viraddr模块 一:实验目的 (1)掌握内核空间、用户空间&#xff…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签,只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上,增加新字段的需求。 实现方式有: (1&…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中,画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流(程)图 Data Flow Diagram,DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具,可以将…

U盘数据恢复实战指南与预防策略

一、U盘数据恢复初探 U盘数据恢复,简而言之,是指当U盘中的数据因各种原因丢失、损坏或无法访问时,通过特定技术和工具,将丢失的数据重新找回的过程。U盘作为现代生活中不可或缺的便携式存储设备,其数据安全性和稳定性…

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤

撰稿 | 行星 来源 | 贝多财经 “起了个大早,赶了个晚集”,用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日,北汽蓝谷新能源科技股份有限公司(SH:600733,简称“北汽蓝谷”)对外披露了子公司北京…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露:理解大型语言模型的参数量级 关键词: #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日,微软在一篇医学相关论文中意外泄露了OpenAI及Claud…

Elasticsearch JavaRestClient版

文章目录 初始化RestHighLeveClient(必要条件)索引库操作1.创建索引库(4步)2.删除索引库(3步)3.判断索引库是否存在(3步)4.总结:四步走 文档操作1.创建文档(4…

HTML——66.单选框

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单选框:&#xff08;如所住省会&#xff0c;性别选择&…

自行下载foremos命令

文章目录 问题描述其他小伙伴的成功解决方案&#xff0c;但对我不适用解决思路失败告终 最终解决成功解决思路解决步骤 问题描述 在kali系统终端中输入foremost&#xff0c;显示无此命令 其他小伙伴的成功解决方案&#xff0c;但对我不适用 解决思路 正常来说使用命令 apt-g…

LED背光驱动芯片RT9293应用电路

一&#xff09;简介&#xff1a; RT9293 是一款高频、异步的 Boost 升压型 LED 定电流驱动控制器&#xff0c;其工作原理如下&#xff1a; 1&#xff09;基本电路结构及原理 RT9293的主要功能为上图的Q1. Boost 电路核心原理&#xff1a;基于电感和电容的特性实现升压功能。当…

AI大模型语音识别转文字

提取音频 本项目作用在于将常见的会议录音文件、各种语种音频文件进行转录成相应的文字&#xff0c;也可从特定视频中提取对应音频进行转录成文字保存在本地。最原始的从所给网址下载对应视频和音频进行处理。下载ffmpeg(https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-…

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…

JVM实战—9.线上FGC的几种案例

大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致频繁FGC(优化反射的软引用被每次YGC回收) 4.线上系统每天数十次FGC导致频繁卡顿的优化(大对象问题…

FreshTomato 路由器固件常见配置以及踩坑记录

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 在上一篇文章《网件 R6400 梅林固件恢复官方固件后刷入 FreshTomato》中&#xff0c;我将网件 R6400 刷入了 FreshTomato 固件&#xff0c;目前已经使用了大半个月了&#xff0c;稳定性比起 380.70_0-X7.9…

嵌入式驱动开发详解8(阻塞/非阻塞/异步通信)

文章目录 前言阻塞非阻塞异步通知后续 前言 首先来回顾一下“中断”&#xff0c;中断是处理器提供的一种异步机制&#xff0c;我们配置好中断以后就 可以让处理器去处理其他的事情了&#xff0c;当中断发生以后会触发我们事先设置好的中断服务函数&#xff0c; 在中断服务函数…

docker内外如何实现ROS通信

写在前面 在一台电脑上装有docker&#xff0c;docker内外均装有ROS系统&#xff0c;现在想要实现docker内外的ROS通信&#xff0c;怎么办呢&#xff1f; 首先&#xff0c;因为是同一台电脑的docker内外&#xff0c;所以IP本身是互通的&#xff0c;不需要在/etc/hosts中添加IP…