在SQL中如何利用SUM OVER函数计算动态累计总和

轻萱酱_1841

轻萱酱_1841

2026-09-14

247人浏览

原创

sum() over()的核心行为是保持原表行数不变,为每行计算窗口内累计和;必须配合order by才能实现逐行动态累计,否则仅返回分组总和。

在sql中如何利用sum over函数计算动态累计总和

什么是 SUM() OVER() 的核心行为

SUM() OVER() 不是普通聚合函数,它不会压缩行数,而是在保持原表结构的前提下,为每一行计算一个基于窗口定义的累计和。关键在于:**结果是否“动态”取决于 ORDER BY 子句是否存在以及如何定义 ROWS BETWEEN**。没写 ORDER BY,就等价于对全分区求和(静态);写了,才可能产生逐行递增的累计效果。

必须显式指定 ORDER BY 才能获得逐行累计

常见错误是只写 SUM(amount) OVER(PARTITION BY category),结果每组内所有行都显示相同总和——这不是累计,是分组总和。要动态累计,ORDER BY 不可省略,且排序字段应反映业务逻辑顺序(如时间、序号):

SELECT 
  date, 
  amount,
  SUM(amount) OVER(ORDER BY date ROWS UNBOUNDED PRECEDING) AS running_total
FROM sales;
  • ROWS UNBOUNDED PRECEDING 是默认行为,可省略,但建议显式写出以明确意图
  • 若用 RANGE 替代 ROWS,遇到相同 date 值时会把它们“捆在一起”求和,可能跳变,多数场景应坚持用 ROWS
  • 排序字段必须有确定性:如果 date 有重复,需追加唯一字段(如 id)避免结果不稳定:ORDER BY date, id

分组内独立累计要用 PARTITION BY + ORDER BY

比如按月份统计每日销售累计,不能只靠全局排序。必须先分区再排序:

芦笋演示
芦笋演示

一款AI演示文稿工具,主要用于一键出成片的录屏演示软件,专为制作产品演示、教学课程和而设计,适合需要提升相关任务效率的用户。

下载
SELECT 
  month,
  day,
  amount,
  SUM(amount) OVER(
    PARTITION BY month 
    ORDER BY day 
    ROWS UNBOUNDED PRECEDING
  ) AS daily_running_in_month
FROM daily_sales;
  • PARTITION BY 决定“重置点”,ORDER BY 决定“累加方向”,二者缺一不可
  • 分区键和排序键的数据类型要合理:用字符串月份(如 '2024-01')比用数字 202401 更安全,避免隐式转换导致排序错乱
  • 某些数据库(如 MySQL 8.0+)要求 ORDER BY 必须存在才能用 ROWS;PostgreSQL 允许无 ORDER BY,但此时窗口帧无效,退化为全分区和

性能与空值:两个容易被忽略的细节

SUM() OVER() 在大数据量下可能比预期慢,尤其当排序字段无索引或分区键选择不当。另外,NULL 值默认被忽略(符合 SQL 标准),但若业务要求将 NULL 视为 0,必须提前处理:

  • 在窗口函数外层用 COALESCE(amount, 0),不要在 OVER 内部写 SUM(COALESCE(...)) —— 后者仍会因 NULL 导致该行不参与累计(SUM 本身跳过 NULL,但位置仍在)
  • 若累计列用于后续过滤(如 WHERE running_total > 1000),注意窗口函数不能直接出现在 WHERE 中,需套一层子查询或 CTE
  • 在 Hive/Spark SQL 中,ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 和简写形式性能一致;但在旧版 Oracle 中,显式写全帧定义更稳妥

真正决定“动态性”的从来不是函数名,而是你有没有给它一条清晰的排序路径和明确的边界指令。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3823

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

811

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

989

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5641

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2603

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5620

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7401

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1010

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

892

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.3万人学习