基于行数与条件删除记录的快速修复脚本开发问询
快速删除冗余销售记录的修复方案
问题拆解
你之前的销售记录生成逻辑是根据quantity值复制对应条数的SKU记录(比如quantity=12就生成12条相同记录),方便单独更新每条的日期;现在业务逻辑切换为按门店位置处理,这些重复的「同SKU+同门店」记录就成了冗余数据,需要针对性清理。
核心修复思路
我们要为每个「SKU + 门店位置」的组合只保留1条有效记录(你可以按需选择保留最新/最早创建的,或者任意一条),删除其余重复项。下面以SQL为例给出具体实现方案(不同数据库语法略有差异,我会标注关键点):
具体操作步骤
1. 先排查冗余数据(避免误删)
先运行查询确认哪些记录是重复的,做到心中有数:
-- 以MySQL为例,假设表名为sales_records,字段包含sku, store_location, created_at, id(唯一主键) SELECT sku, store_location, COUNT(*) AS duplicate_count FROM sales_records GROUP BY sku, store_location HAVING COUNT(*) > 1 ORDER BY duplicate_count DESC;
2. 执行删除操作
根据你的需求选择对应脚本:
- 场景1:保留每个组合中最新创建的记录
DELETE sr1 FROM sales_records sr1 JOIN sales_records sr2 ON sr1.sku = sr2.sku AND sr1.store_location = sr2.store_location AND sr1.created_at < sr2.created_at;
- 场景2:保留每个组合中最早创建的记录
DELETE sr1 FROM sales_records sr1 JOIN sales_records sr2 ON sr1.sku = sr2.sku AND sr1.store_location = sr2.store_location AND sr1.created_at > sr2.created_at;
- 如果没有created_at字段,用唯一主键id判断
比如保留id最小的那条基准记录:
DELETE sr1 FROM sales_records sr1 JOIN sales_records sr2 ON sr1.sku = sr2.sku AND sr1.store_location = sr2.store_location AND sr1.id > sr2.id;
关键注意事项
- 先备份! 执行删除前一定要备份整个表,或者导出待删除的记录到临时表,防止误删导致数据不可逆丢失。
- 先测试! 先在测试环境跑一遍脚本,确认删除结果符合预期后,再放到生产环境执行。
- 适配数据库 如果用PostgreSQL/Oracle,语法会有差异:比如PostgreSQL用
DELETE USING,Oracle用子查询关联,需要根据你的数据库类型调整。 - 大表分批处理 如果数据量很大,不要一次性删除所有冗余记录,分批次(比如按SKU分段)执行,避免锁表影响正常业务。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

