解读 SQL 累加计算:从传统方法到窗口函数

累加计算是数据分析中的常见需求,例如累计销售额、累计访问量、累计收益等场景。在 SQL 中,存在多种实现累加计算的方法,本文将系统解析各类实现方式及其适用场景。

一、基础数据准备

首先创建一张销售记录表示例:

```sql

创建销售记录表

CREATE TABLE Sales (

SaleDate DATE, 销售日期

ProductName VARCHAR(50), 产品名称

DailySales DECIMAL(10,2) 日销售额

);

插入测试数据

INSERT INTO Sales VALUES

('20240101', '产品A', 1000.00),

('20240102', '产品A', 1500.00),

('20240103', '产品A', 800.00),

('20240104', '产品A', 2000.00),

('20240101', '产品B', 500.00),

('20240102', '产品B', 700.00),

('20240103', '产品B', 1200.00);

查看数据

SELECT FROM Sales ORDER BY ProductName, SaleDate;

```

二、方法一:基于自连接实现

在窗口函数尚未普及时,自连接是常用的累加实现方式,但其性能在处理大规模数据时表现不佳:

```sql

通过自连接计算各产品累计销售额

SELECT

s1.ProductName,

s1.SaleDate,

s1.DailySales,

SUM(s2.DailySales) AS CumulativeSales

FROM Sales s1

INNER JOIN Sales s2

ON s1.ProductName = s2.ProductName 按产品分组

AND s2.SaleDate <= s1.SaleDate 仅累计当前日期及之前的销售

GROUP BY s1.ProductName, s1.SaleDate, s1.DailySales

ORDER BY s1.ProductName, s1.SaleDate;

```

输出结果示例:

产品名称销售日期每日销售累计销售
产品A202401011000.001000.00
产品A202401021500.002500.00
产品A20240103800.003300.00
产品A202401042000.005300.00
产品B20240101500.00500.00
产品B20240102700.001200.00
产品B202401031200.002400.00

不足之处: 数据量较大时,由于涉及笛卡尔积关联,性能存在显著瓶颈。

三、方法二:基于子查询实现

作为一种传统实现方式,子查询同样伴随明显的性能问题:

```sql

使用关联子查询进行累计计算

SELECT

s1.ProductName,

s1.SaleDate,

s1.DailySales,

(

SELECT SUM(s2.DailySales)

FROM Sales s2

WHERE s2.ProductName = s1.ProductName

AND s2.SaleDate <= s1.SaleDate

) AS CumulativeSales

FROM Sales s1

ORDER BY s1.ProductName, s1.SaleDate;

```

缺点: 每行记录均需执行一次子查询,性能负担更为沉重。

四、方法三:使用窗口函数(推荐)

在现代 SQL 中,窗口函数是实现累加计算的首选方法,具备优异的执行效率与表达能力:

```sql

通过 SUM() OVER() 窗口函数计算累计销售额

SELECT

ProductName,

SaleDate,

DailySales,

SUM(DailySales) OVER (

PARTITION BY ProductName 按产品分组

ORDER BY SaleDate 按销售日期排序

ROWS BETWEEN UNBOUNDED PRECEDING 从首行开始

AND CURRENT ROW 至当前行

) AS CumulativeSales,

简洁写法:默认范围即为从首行到当前行

SUM(DailySales) OVER (

PARTITION BY ProductName

ORDER BY SaleDate

) AS CumulativeSales2 结果与上述一致

FROM Sales

ORDER BY ProductName, SaleDate;

```

窗口函数的优势:

1. 高性能:仅需单次数据扫描即可完成计算;

2. 灵活性高:支持通过框架子句精确控制累计范围;

3. 可读性强:逻辑清晰,易于编写与维护。

五、方法四:基于CTE递归实现(适用于特殊场景)

对于依赖前序行进行递推计算的场景(如斐波那契数列),可使用递归公用表表达式:

```sql

使用递归CTE生成斐波那契数列

WITH Fibonacci (n, a, b) AS (

初始成员

SELECT 1, 0, 1

UNION ALL

递归成员:基于前一行计算

SELECT n + 1, b, a + b

FROM Fibonacci

WHERE n < 10 限制递归深度,避免无限循环

)

SELECT n, b AS FibonacciNumber

FROM Fibonacci

ORDER BY n;

```

最佳实践建议:

1. 优先选择窗口函数,特别是 `SUM() OVER()`,其在性能与表达上均占优;

2. 明确排序规则:累加计算必须指定 `ORDER BY`,否则结果不具备确定性;

3. 合理划分分区:通过 `PARTITION BY` 实现分组内的独立累计;

4. 精确控制窗口范围:利用 `ROWS BETWEEN` 子句定义累加的行范围;

5. 避免使用游标:除非特定需求,否则不建议采用游标实现累加逻辑。

六、实战示例:计算销售额累计占比排行榜

```sql

按产品总销售额排序,并计算累计占比

WITH ProductSales AS (

SELECT

ProductName,

SUM(DailySales) AS TotalSales

FROM Sales

GROUP BY ProductName

),

RankedProducts AS (

SELECT

ProductName,

TotalSales,

ROW_NUMBER() OVER (ORDER BY TotalSales DESC) AS Rank,

SUM(TotalSales) OVER (ORDER BY TotalSales DESC) AS CumulativeSales,

SUM(TotalSales) OVER () AS GrandTotal

FROM ProductSales

)

SELECT

ProductName,

TotalSales,

Rank,

CumulativeSales,

CAST(CumulativeSales 100.0 / GrandTotal AS DECIMAL(5,2)) AS CumulativePercentage

FROM RankedProducts

ORDER BY Rank;

```

总结

累加计算是 SQL 数据分析中的关键能力。在现代 SQL Server 中,推荐采用窗口函数来实现相关需求。掌握以下三个核心要素,即可灵活应对各类累加场景:

PARTITION BY:定义分组依据;

ORDER BY:指定排序规则;

窗口框架:明确累计范围(默认为首行至当前行)。

熟练掌握上述方法后,各类累计计算需求均可迎刃而解。今后面对累加问题时,不妨首先考虑窗口函数这一高效而强大的工具。

来源:小程序app开发|ui设计|软件外包|IT技术服务公司-木风未来科技-成都木风未来科技有限公司

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

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

相关文章

虚拟主播技术揭秘:M2FP如何实现精准面部捕捉?

虚拟主播技术揭秘&#xff1a;M2FP如何实现精准面部捕捉&#xff1f; 在虚拟主播、数字人直播、AR互动等前沿应用场景中&#xff0c;高精度的面部与人体解析技术是实现沉浸式体验的核心基础。传统的动作捕捉系统依赖昂贵硬件和标记点&#xff0c;而现代AI驱动的方案正逐步实现“…

M2FP模型源码解读:理解语义分割核心算法

M2FP模型源码解读&#xff1a;理解语义分割核心算法 &#x1f4cc; 引言&#xff1a;从多人人体解析看语义分割的工程落地挑战 在计算机视觉领域&#xff0c;语义分割&#xff08;Semantic Segmentation&#xff09;是实现像素级图像理解的核心任务之一。与目标检测不同&…

Markdown数学公式翻译:特殊符号的保护策略

Markdown数学公式翻译&#xff1a;特殊符号的保护策略 &#x1f310; AI 智能中英翻译服务 (WebUI API) 项目背景与技术挑战 在现代科研、工程文档和学术写作中&#xff0c;Markdown 已成为内容表达的标准格式之一。它简洁、可读性强&#xff0c;并天然支持嵌入 LaTeX 数学公式…

M2FP文档详解:从启动到调用的全流程操作手册

M2FP文档详解&#xff1a;从启动到调用的全流程操作手册 &#x1f9e9; M2FP 多人人体解析服务简介 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键任务&#xff0c;旨在对图像中的人体进行像素级语义分割&#xff0c;识别出如头发、面…

上海交大团队重磅突破:让AI大模型推理速度提升24倍的神奇技术

这项由上海交通大学计算机科学与工程学院的徐嘉鸣、潘嘉毅、王汉臻、周永康、叶建才等研究人员&#xff0c;以及清华大学的王瑜教授、无问芯穹公司的戴国浩教授共同完成的研究&#xff0c;发表于2025年的国际顶级会议论文中。这项名为"SpeContext"的技术突破&#xf…

其实申请TC并不难

在我们申请交易证书&#xff08;TC&#xff09;时&#xff0c;需遵循一系列要求以确保流程顺利。 以下几点关键注意事项基于最新实践整理。资质匹配&#xff1a;SC证书有效机构一致&#xff0c;买家认证信息无错漏 追溯完整&#xff1a;上游TC/RMD齐全&#xff0c;分包商已备案…

M2FP模型处理遮挡场景的算法原理剖析

M2FP模型处理遮挡场景的算法原理剖析 &#x1f9e9; 多人人体解析中的核心挑战&#xff1a;遮挡问题 在现实世界的视觉应用中&#xff0c;多人共处同一画面是常态。然而&#xff0c;当多个个体发生身体重叠、肢体交叉或空间遮挡时&#xff0c;传统语义分割模型往往难以准确区…

字节机器人学会了“穿鞋带“:83.3%成功率背后的灵巧操作新突破

这项由字节跳动Seed团队完成的突破性研究发表于2025年12月1日的arXiv预印本平台&#xff0c;论文编号为arXiv:2512.01801v1。有兴趣深入了解的读者可以通过该编号查询完整论文。这是全球首个能够自主穿鞋带的学习型机器人系统&#xff0c;在这个看似简单却极其复杂的任务上实现…

基于springboot + vue美食分享管理系统(源码+数据库+文档)

美食分享 目录 基于springboot vue美食分享系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue美食分享系统 一、前言 博主介绍&#xff1a;✌️大…

M2FP资源占用实测:内存峰值控制在2GB以内

M2FP资源占用实测&#xff1a;内存峰值控制在2GB以内 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与技术痛点 在当前计算机视觉应用中&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 已成为智能服装推荐、虚拟试衣、动作分析等场景的核心技术。传…

震惊!AI三剑客横空出世,小白也能玩转单细胞数据分析!CellAgent框架让你秒变生物数据专家

今天分享一篇在 arXiv 预印的文章&#xff0c;标题是 “CellAgent: An LLM-driven Multi-Agent Framework for Automated Single-cell Data Analysis”。 本文针对单细胞 RNA 测序数据分析推出了 CellAgent&#xff0c;CellAgent 构建了基于大语言模型 LLM 的生物学专家角色——…

人体解析入门指南:M2FP提供完整API文档与调用示例

人体解析入门指南&#xff1a;M2FP提供完整API文档与调用示例 &#x1f4d6; 项目简介&#xff1a;M2FP 多人人体解析服务 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;旨在将图像中的人体分解为多…

网页内容抓取翻译:CSANMT配合爬虫实现整站中英转换

网页内容抓取翻译&#xff1a;CSANMT配合爬虫实现整站中英转换 &#x1f310; AI 智能中英翻译服务 (WebUI API) 项目背景与技术痛点 在多语言互联网生态中&#xff0c;中文网站的国际化传播面临巨大挑战。传统翻译工具如Google Translate或百度翻译虽具备通用能力&#xff0c…

为什么推荐M2FP给中小企业?零成本+零运维即可上线

为什么推荐M2FP给中小企业&#xff1f;零成本零运维即可上线 在当前AI技术快速普及的背景下&#xff0c;越来越多的中小企业开始探索计算机视觉能力的应用场景——从智能零售试衣到健身动作分析&#xff0c;再到虚拟形象生成。然而&#xff0c;高昂的算力成本、复杂的模型部署流…

零基础部署M2FP:5分钟搭建多人人体解析服务

零基础部署M2FP&#xff1a;5分钟搭建多人人体解析服务 &#x1f31f; 为什么需要多人人体解析&#xff1f; 在智能服装推荐、虚拟试衣、人机交互和视频监控等场景中&#xff0c;精确理解人体结构是关键技术前提。传统的人体分割模型往往只能识别“人”与“非人”&#xff0c…

M2FP模型量化实践:INT8推理速度提升2倍

M2FP模型量化实践&#xff1a;INT8推理速度提升2倍 &#x1f4cc; 背景与挑战&#xff1a;多人人体解析的工程落地瓶颈 在智能视觉应用中&#xff0c;多人人体解析&#xff08;Multi-person Human Parsing&#xff09;是实现虚拟试衣、动作分析、人像美化等高级功能的核心技术。…

基于java+ vue银行柜台管理系统(源码+数据库+文档)

银行柜台管理 目录 基于springboot vue银行柜台管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue银行柜台管理系统 一、前言 博主介绍&…

百度搜索优化技巧:将M2FP解析结果用于SEO图片标注

百度搜索优化技巧&#xff1a;将M2FP解析结果用于SEO图片标注 &#x1f4cc; 引言&#xff1a;从图像语义理解到搜索引擎可见性提升 在当前内容为王的互联网生态中&#xff0c;图片内容已成为网页信息传递的重要载体。然而&#xff0c;搜索引擎&#xff08;如百度&#xff09;对…

真有截图后发现图片是被打马赛克的

b 站截图后可以这样&#xff0c;记录下自己新增的见闻

Meta推出Tuna模型:一个AI既能看懂图片又能画画的神奇系统

这项由Meta公司BizAI团队领衔&#xff0c;联合香港大学、滑铁卢大学等多个机构的研究团队开发的Tuna模型&#xff0c;于2025年1月发表在arXiv预印本平台上&#xff0c;编号为arXiv:2512.02014v1。这个名为Tuna的人工智能系统就像一个既会看画又会画画的全能艺术家&#xff0c;它…