如何用SQL增量更新每日汇总表

风雪酱_6329

风雪酱_6329

2026-08-27

170人浏览

原创

增量更新必须依赖时间戳或自增id字段,常见错误是全量覆盖或模糊判断;应使用created_at/updated_at等单调字段并确保非空、有索引,注意时区一致;优先用insert…on conflict或merge实现追加+修正,避免delete+insert;sql需带${biz_date}等动态参数。

如何用sql增量更新每日汇总表

增量更新必须依赖时间戳或自增ID字段

没有可排序、可比较的单调递增字段,就谈不上真正可靠的增量更新。常见错误是用 UPDATE 直接覆盖全量数据,或者靠业务侧“昨天跑过了”这种模糊判断——一旦中间某天失败,后续全错。
真实场景中,created_at 或 updated_at 是最常用依据;如果表没这类字段,优先加索引后补上,而不是硬凑其他逻辑。

  • 必须确保该字段在源表上非空、有索引(否则 WHERE created_at > ? 会全表扫描)
  • 注意时区问题:数据库时区、ETL任务所在服务器时区、业务约定的“日切点”是否一致(比如用 DATE(created_at) 还是 DATE(created_at AT TIME ZONE 'Asia/Shanghai'))
  • 避免用 MAX(id) 做增量起点——如果存在批量插入、ID跳号、或软删除导致ID不连续,就会漏数据

INSERT … ON CONFLICT(PostgreSQL)或 MERGE(SQL Server)才是正解

每天只追加新记录、再修正变更记录,不能简单 DELETE + INSERT 全量重刷——汇总表通常被下游报表/BI高频查询,锁表几秒都可能引发报警。
PostgreSQL 推荐用 INSERT … ON CONFLICT DO UPDATE,SQL Server 用 MERGE,MySQL 用 INSERT … ON DUPLICATE KEY UPDATE。

  • 目标表必须有唯一约束(如 (stat_date, product_id)),否则冲突检测失效
  • ON CONFLICT 的 DO UPDATE SET 部分,只更新需要变化的列(比如 sales_amount = EXCLUDED.sales_amount),别写成 SET * = EXCLUDED.* ——会覆盖掉人工修正过的值
  • MySQL 的 ON DUPLICATE KEY UPDATE 不支持子查询,如果要聚合计算(如累加当日销量),得先在子查询里算好再传入

增量SQL必须带明确的日期范围参数

硬编码 WHERE created_at >= '2024-05-10' 是灾难源头。所有调度任务里的 SQL 都该用占位符或变量,由调度器注入当天/昨日日期。

  • 推荐参数名统一用 ${biz_date}(表示统计截止日),然后写成 WHERE created_at >= ${biz_date}::DATE AND created_at
  • 别用 BETWEEN,它包含两端,容易因毫秒级数据跨日导致重复或遗漏
  • 如果源表有分区(如按天分区),务必让 WHERE 条件能命中具体分区,否则扫描成本飙升

第一次初始化和断档恢复要单独处理

增量逻辑跑通后,往往发现历史数据没补全,或某天任务失败导致后续全断。这时候不能直接套用每日SQL——它只会处理“最新一天”,不会往前追溯。

  • 初始化时,用 INSERT INTO summary_table SELECT … FROM source_table WHERE created_at ,一次性灌完历史
  • 断档恢复需人工指定起止日期,例如重跑 5月8日到5月10日:WHERE created_at >= '2024-05-08' AND created_at ,并确认目标表对应日期范围数据已清空
  • 生产环境建议加校验步骤:跑完后查 SELECT COUNT(*) FROM summary_table WHERE stat_date = ${biz_date},与源表当日增量数比对

实际最难的不是写SQL,是确认“哪条数据该算进哪天”——比如订单支付时间、发货时间、结算时间,业务口径一旦变,整个增量逻辑就得跟着调。这个细节没人帮你兜底,得和产品、财务一起对齐。

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

4063

8

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

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

2023.10.27

871

4

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

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

2024.02.23

1049

5

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

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

2024.03.06

5941

10

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

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

2024.03.06

2843

4

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

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

2024.04.07

5920

11

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

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

2024.04.29

7901

6

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

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

2024.04.29

1070

5

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

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

2024.04.29

932

5

热门下载

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

精品课程

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

共6课时 | 54.6万人学习

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

共89课时 | 133.4万人学习