SQL查询删除重复行方法:如何删除同支付不同日期的重复记录
SQL删除仅日期字段不同的重复支付记录方案
首先明确业务前提:假设你的支付记录表名为payment_records,用来判定为同一笔支付的唯一标识字段可以是支付流水号、订单号、用户ID+交易金额组合等(可根据实际业务调整),存在差异的日期字段为create_time。
前置验证步骤(必做,避免误删数据)
先执行查询语句确认要删除的重复行,以下示例默认规则为保留日期最新的记录,删除更早的重复记录,如果要保留最早的记录调整排序规则即可:
-- 先查询待删除的重复数据,确认范围无误再执行删除 SELECT * FROM ( SELECT *, ROW_NUMBER() OVER( PARTITION BY pay_flow_no -- 此处替换为你判定重复的字段,多个用逗号分隔 ORDER BY create_time DESC -- 倒序后rn=1为要保留的最新记录 ) AS rn FROM payment_records ) t WHERE t.rn > 1;
正式删除操作
方案1:适配MySQL8.0+、PostgreSQL、SQL Server、Oracle等支持窗口函数的数据库
WITH duplicate_data AS ( SELECT *, ROW_NUMBER() OVER( PARTITION BY pay_flow_no ORDER BY create_time DESC ) AS rn FROM payment_records ) DELETE FROM duplicate_data WHERE rn > 1;
如果需要保留最早的记录,仅需将ORDER BY create_time DESC改为ORDER BY create_time ASC即可。
方案2:适配MySQL5.x等不支持窗口函数的低版本数据库
DELETE p1 FROM payment_records p1 INNER JOIN payment_records p2 ON p1.pay_flow_no = p2.pay_flow_no -- 重复判定字段匹配 AND p1.create_time < p2.create_time; -- 删除日期更早的重复行
重要提示:执行删除前请先对原表做全量备份,或者开启事务执行删除,验证结果符合预期后再提交事务,避免数据丢失无法恢复。
内容的提问来源于stack exchange,提问作者Leeh Gabech
相关产品推荐
相关产品推荐

