sql 中 sum () over order by 用法_sql 中 sum () over 按序累加详解

sum() over(order by …) 是 sql 窗口函数,用于按指定列排序后逐行累加前面所有行的值。1. 它默认从第一行累加到当前行,适合累计求和场景,如计算每日销售额总和;2. 通过 rows between 可自定义窗口范围,例如仅累加前两行或计算移动平均;3. 使用时需注意明确排序字段、避免非唯一排序、考虑分区字段影响。正确使用可提升报表分析效率与性能。

sql 中 sum () over order by 用法_sql 中 sum () over 按序累加详解

在 SQL 中,SUM() OVER() 是一个窗口函数,常用于对数据进行累计计算。而当你加上 ORDER BY 子句时,它的作用就变成了“按序累加”,也就是我们常说的累计求和

sql 中 sum () over order by 用法_sql 中 sum () over 按序累加详解

什么是 SUM() OVER(ORDER BY ...)

简单来说,这个表达式的作用是:
按照指定字段排序后,逐行累加前面所有行(包括当前行)的值。

比如你有一张销售记录表,想看每天销售额的累计总和,就可以用它来实现。

sql 中 sum () over order by 用法_sql 中 sum () over 按序累加详解

语法结构如下:

SUM(column_name) OVER (ORDER BY order_column [ASC|DESC] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

column_name:要累加的列order_column:排序依据的列ROWS BETWEEN ...:定义窗口范围,这里是默认的从第一行到当前行

实际使用场景举例

假设你有这样一张销售表 sales

sql 中 sum () over order by 用法_sql 中 sum () over 按序累加详解

date amount

2024-01-011002024-01-022002024-01-03150

你想看到的是每天的累计销售额:

date amount total_so_far

2024-01-011001002024-01-022003002024-01-03150450

SQL 查询可以这样写:

SELECT   date,  amount,  SUM(amount) OVER (ORDER BY date) AS total_so_farFROM sales;

这样就能轻松得到“按日期顺序”的累计金额了。

窗口范围控制细节

虽然默认情况下是“从第一行加到当前行”,但你可以通过 ROWS BETWEEN 明确指定窗口范围,比如:

百度文心百中 百度文心百中

百度大模型语义搜索体验中心

百度文心百中 22 查看详情 百度文心百中

只加前两行 + 当前行

ROWS BETWEEN 2 PRECEDING AND CURRENT ROW

加到当前行的前一行

ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING

这些控制方式适用于更复杂的累计需求,比如移动平均、滑动窗口统计等。

常见组合如下:

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:默认行为,从头加到当前行ROWS BETWEEN 1 PRECEDING AND CURRENT ROW:只加前一行和当前行ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING:从当前行加到末尾,适合反向统计

注意事项与易错点

排序字段必须明确

如果不写 ORDER BY,那 SUM() OVER() 就只是整列总和重复显示。只有加上 ORDER BY 才能形成“逐步累加”的效果。

避免使用非唯一排序字段

如果排序字段有重复值,数据库可能会以不确定的方式处理它们的顺序,导致结果不稳定。建议加上第二个排序字段做辅助,比如 (ORDER BY date, id)

分区字段的影响

如果你还用了 PARTITION BY,记得它是先分组再排序累加的。比如按地区分区后,每个地区的数据会单独做累加。

基本上就这些。用好 SUM() OVER(ORDER BY ...),可以在报表分析、趋势展示中节省大量代码,而且性能也比子查询更好。关键是要理解窗口函数的执行逻辑,尤其是排序和窗口范围这两个部分。

以上就是sql 中 sum () over order by 用法_sql 中 sum () over 按序累加详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/603184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 21:33:34
下一篇 2025年11月10日 21:35:28

相关推荐

  • 迁移PHPCMS网站到新域名的详细步骤

    迁移phpcms网站到新域名的核心步骤包括:1.全面备份网站文件和数据库,确保有恢复保障;2.将备份文件上传至新服务器并解压,或调整服务器目录指向;3.创建新数据库并导入备份,执行sql更新v9_site表的domain和siteurl、v9_setting表的base_url等关键字段;4.修改d…

    2025年12月10日 好文分享
    000
  • PHP如何使用MySQL数据库 PHP源码连接MySQL配置指南

    php连接mysql的解决方案是使用mysqli或pdo扩展,其中mysqli是官方推荐、性能更佳的选择,而pdo支持多数据库连接、灵活性更高。1. 安装扩展:linux下通过sudo apt-get install php-mysqli或sudo yum install php-mysqli安装m…

    2025年12月10日 好文分享
    000
  • PHP 函数如何与 SQL 交互

    php 提供一系列函数用于与 sql 数据库交互:使用 mysqli_connect 连接到数据库。使用 mysqli_query 执行 sql 查询。使用以下函数之一处理查询结果:mysqli_fetch_row(以关联数组形式获取单行结果)mysqli_fetch_assoc(以关联数组形式获取…

    2025年12月9日
    000
  • SQL文件如何Mysql 导入数据库

    1、在 win 系统下使用 mysql 中的source命令即可实现导入 sql 文件: mysql -u root -pmysql>use 数据库名mysql>source d:/数据库名 这样就完成了 Win 系统下的 SQL 文件的导入。 2、在 Linux 系统下导入 SQL 文…

    数据库 2025年12月5日
    100
  • MySQL内连接、外连接及SQL JOINS的实现方法是什么

    1. 内连接 内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行。 说人话就是,查询结果只包含它们匹配的行,不匹配的就不要了。 【例子】查询员工编号 employee_id 和其对应的部门名称 department_name 。其中部门名称 department_na…

    2025年12月4日 数据库
    000
  • MySQL之SQL语法及SQL解析顺序源码分析

    sql(structured query language)是一种标准,作为一种访问【关系型数据库的标准语言】。许多数据库产品,如oracle,db2,sql server,postgresql,mysql都支持它。在过去几年中,nosql最初声称不需要sql,但最终不得不修正为”not…

    2025年12月4日 数据库
    000
  • mysql如何执行sql脚本

    类似于普通的脚本语言,MySQL也有一套对字符、单词和特殊符号的使用规则,MySQL通过执行SQL脚本来完成对数据库的操作,这个脚本由一个或多个MySQL语句(SQL语句+扩展语句)组成,脚本文件的后缀名称通常是.%ign%ignore_a_1%re_a_1%。MySQL客户机还可以在控制台上执行语…

    数据库 2025年12月3日
    000
  • mysql实现按组区分后获取每组前几名的sql怎么写

    遇到一个场景,要把数据分组,然后获取每组前10条数据,首先我想到用group by分组,但是难点是分组后怎么知道该数据在组里面排第几条。 一、创建表,插入相关测试数据 CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMEN…

    2025年12月3日
    000
  • mysql的DML进阶、分页查找、SQL约束及多表操作方法

    一. 什么是DML, 以及DML基本操作, 表的列和行的跟新操作 针对列进行修改操作 #首先简单的创建一个student表为后序操作做准备use test;create table student (id int,name varchar(8),age tinyint) engine = innod…

    2025年12月3日 数据库
    000
  • sql中怎么执行批处理 批处理执行的高效方法分享

    在sql中执行批处理的关键在于使用不同数据库的特定方法一次性执行多条语句。在sql server中,使用go命令分隔多个批处理,每个go之间的语句为一个独立批处理;在mysql中,可通过客户端工具或编程语言(如python)执行包含多条语句的脚本文件,同时注意分割语句并忽略空行;批处理错误可通过事务…

    2025年12月3日 数据库
    000
  • SQL中substring函数怎么用 5分钟掌握substring函数核心用法

    sql中的substring函数用于截取字符串,基本语法为substring(string, start, length),其中string为要截取的字符串,start为开始位置(从1开始),length为截取字符数;例如从’hello world’中截取’wor…

    2025年12月3日 数据库
    000
  • sql中如何实现递归查询 递归查询的经典案例演示

    sql递归查询通过cte实现层级数据查询,核心在于锚点成员与递归成员结合,常见错误包括无限循环、性能问题、数据类型不匹配等;优化方法有索引优化、限制递归深度、使用临时表等;不同数据库如postgresql、sql server、mysql支持递归cte,oracle则使用connect by语法。 …

    2025年12月3日 数据库
    000
  • SQL中NULL值处理的注意事项 NULL值在SQL运算中的特殊规则解析

    sql中null值处理需特别注意其特性及运算规则。1. null代表未知或缺失,不能用=判断,需使用is null或is not null;2. null参与运算结果通常也为null,需用isnull、coalesce、ifnull等函数替换默认值;3. 统计时avg会忽略null值影响结果,可用c…

    2025年12月3日 数据库
    000
  • SQL如何计算数据总数 SQL数据总数统计方法分享

    %ign%ignore_a_1%re_a_1%中统计数据总数最直接的方法是使用count()函数,它会统计表中所有行的数量,包括null值。例如:select count() from employees; 可返回总行数。其次,若需统计特定列非null值的数量,则使用count(column_nam…

    2025年12月3日 数据库
    000
  • sql中怎么插入多条数据 批量插入数据的便捷方法分享

    在sql中插入多条数据的方法有多种,核心是提高效率并减少数据库交互。1. 使用insert into … values一次性插入多条记录,适用于少量数据;2. 通过创建临时表插入数据并进行预处理;3. mysql使用load data infile高效导入文件数据;4. postgres…

    2025年12月3日 数据库
    000
  • SQL查询不等于某个日期的写法 日期不等查询的注意事项

    要排除特定日期的数据需使用!=或运算符并注意格式匹配,1.直接使用!=或排除特定日期,如select * from table where date_column != ‘2023-10-27’;2.若字段含时间部分,建议用范围查询排除整日数据;3.可借助数据库函数如mysq…

    2025年12月3日 数据库
    000
  • sql中rank和dense_rank的区别 窗口函数rank/dense_rank对比

    简而言之,RANK() 会产生跳跃的排名,而 DENSE_RANK() 则不会。如果你需要考虑并列排名,并且不希望排名出现空隙,那么 DENSE_RANK() 更适合。 RANK() vs DENSE_RANK():%ign%ignore_a_1%re_a_1%对比 SQL 中的 RANK() 和 …

    2025年12月3日 数据库
    000
  • SQL如何实现分页查询 SQL分页查询3种实现方案

    优化sql分页查询性能的核心在于减少offset的使用,避免全表扫描。1.使用limit和offset适用于小数据量,但offset过大时会导致性能急剧下降;2.通过子查询或join先找到起始id再进行范围查询,在一定程度上提升性能;3.书签式分页基于唯一递增字段记录上一页最后一条数据id,直接从该…

    2025年12月3日 数据库
    000
  • sql中怎么创建视图 视图创建的详细步骤解析

    视图是存储的sql查询,用于简化复杂查询、提高数据安全性和提供友好访问方式。创建视图的核心是使用create view语句,语法为create view view_name as select …,例如创建显示工资高于5000员工信息的视图。视图分为简单视图(基于单表、无聚合函数)和复杂…

    2025年12月3日 数据库
    000
  • sql中如何创建数据库 创建数据库的完整步骤解析

    创建数据库需先通过sql语句如create database database_name;命名应简洁明确,反映数据类型或用途,避免特殊字符和保留字,推荐使用小写字母与下划线组合;选择dbms时要考虑性能、功能及成本,还需考虑并发处理、安全性及备份策略;创建后需设计表结构,遵循范式减少冗余,建立外键关…

    2025年12月3日 数据库
    000

发表回复

登录后才能评论
关注微信