SQL中如何计算最近30天滚动销量?

小枫吖_6583

小枫吖_6583

2026-07-23

219人浏览

原创

滚动30天销量和需用窗口函数range between interval 29 day preceding and current row按日期值范围滑动计算,确保每个日期包含自身及往前29天的销量总和;mysql 8.0+/postgresql支持,老版本需用子查询或join兜底,且必须为sale_date建索引以避免全表扫描。

sql中如何计算最近30天滚动销量?

DATE_SUB 和窗口函数实现滚动求和

MySQL 8.0+ 或 PostgreSQL 可直接用窗口函数加时间过滤,核心是把“最近30天”转化为按日期排序、向前取30行的累计逻辑。但注意:滚动30天 ≠ 最近30个自然日销量总和,而是每个日期都算它往前推30天(含当天)的销量和。

典型写法:

SELECT 
  sale_date,
  SUM(sales_amount) OVER (
    ORDER BY sale_date 
    RANGE BETWEEN INTERVAL 29 DAY PRECEDING AND CURRENT ROW
  ) AS rolling_30d_sales
FROM sales
WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 29 DAY);
  • RANGE BETWEEN INTERVAL 29 DAY PRECEDING AND CURRENT ROW 是关键,它按日期值范围滑动,不是按行数;如果某天没数据,会自动跳过,不影响跨度
  • 必须配合 ORDER BY sale_date,否则窗口无法按时间对齐
  • MySQL 中 RANGEDATE 类型支持有限,部分版本只认 ROWS;若报错,改用自连接或子查询兜底

兼容老版本 MySQL(5.7)的替代方案

没有窗口函数时,得靠相关子查询或 JOIN 模拟滚动。性能差但稳定,适合数据量不大的表。

FaceSwapper
FaceSwapper

FaceSwapper是一款支持照片、视频和 GIF 换脸的在线 AI 换脸工具。

下载

常见写法:

SELECT 
  t1.sale_date,
  (SELECT SUM(t2.sales_amount)
   FROM sales t2 
   WHERE t2.sale_date BETWEEN DATE_SUB(t1.sale_date, INTERVAL 29 DAY) AND t1.sale_date) AS rolling_30d_sales
FROM sales t1
WHERE t1.sale_date >= '2024-01-01';
  • 子查询里用 DATE_SUB(t1.sale_date, INTERVAL 29 DAY) 动态算起点,确保每天都是独立的30天窗口
  • 务必给 sale_date 加索引,否则每次子查询都全表扫描,几万行就明显卡顿
  • 如果销售表有重复日期(比如多笔订单同一天),SUM 没问题,但别误用 COUNT(*) 当销量——那是订单数,不是金额

日期边界容易漏掉的坑

“最近30天”在业务中常被理解为“过去30个日历日”,但 SQL 计算时容易错算成29天或31天。

  • INTERVAL 30 DAY 是从当前日往前推30整天,包含起止日共31天;要严格30天(含当天),得用 INTERVAL 29 DAY
  • 如果用 BETWEEN a AND b,MySQL 默认闭区间,ab 都包含;但若字段带时间(如 datetime),需用 + <code>>= 并手动加 23:59:59,否则最后一天可能丢数据
  • 跨月计算时(比如1月31日往前推29天),DATE_SUB 自动处理,不用自己判断大小月

为什么不能直接用 GROUP BY DATE_SUB(sale_date, INTERVAL DAYOFYEAR(sale_date) DAY)

有人想先截断日期再分组聚合,但这算的是“每月累计”或“每周累计”,不是滚动窗口。滚动的核心是每个输出行对应一个独立的时间切片,而不是归并。

  • 滚动销量必须保留原始粒度(通常是日级),不能先 GROUP BY 再算——那样丢失了中间日期的动态性
  • 如果源表只有月度汇总,那就没法算真正的滚动30天,只能近似用月均值×30,但误差不可控
  • 真正要压测性能时,优先考虑物化滚动结果到一张每日快照表,用定时任务更新,避免每次查都实时计算
实际跑起来,最麻烦的往往不是语法,而是确认业务定义里的“30天”到底包不包含当天、是否剔除节假日、以及数据源里有没有空缺日期——这些都会让 RANGEROWS 的行为完全不同。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.10.12

3743

8

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

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

2023.10.27

791

4

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

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

2024.02.23

969

5

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

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

2024.03.06

5521

10

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

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

2024.03.06

2523

4

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

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

2024.04.07

5520

11

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

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

2024.04.29

7201

6

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

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

2024.04.29

970

5

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

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

2024.04.29

872

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
FastAPI SQL数据库实战文档
FastAPI SQL数据库实战文档

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 172人学习