如何在MariaDB中删除DATE字段重复的行?(SQL新手求助)
在MariaDB中删除DATE字段重复的行(对应pandas的drop_duplicates)
嘿,作为刚接触SQL的新手,碰到这种和pandas里drop_duplicates()类似的去重需求太常见了!结合你的表有自增id字段的情况,我给你几个在MariaDB里完全可行的方案:
方法1:通过自增ID直接删除重复行(推荐)
你的表有自增id,这是处理重复行的关键!我们可以利用id来区分同一date下的重复记录,只保留其中一条(比如保留每个date对应的最小id行,和你给出的样本期望结果一致)。
执行下面的SQL语句(记得把your_table_name换成你实际的表名):
DELETE t1 FROM your_table_name t1 JOIN your_table_name t2 ON t1.date = t2.date AND t1.id > t2.id;
解释:这个语句会将每个date分组里,id更大的重复行删除,最终每个date只会留下id最小的那一行。
方法2:用临时表批量处理(适合大数据量表)
如果你的表数据量很大,方法1的JOIN操作可能效率偏低,这时可以用临时表的方式来批量处理:
- 先将去重后的数据插入临时表(确保只保留每个
date的一条记录):
-- 严谨的写法:取每个date对应的最小id的行 CREATE TEMPORARY TABLE temp_unique_dates SELECT t1.* FROM your_table_name t1 INNER JOIN ( SELECT date, MIN(id) AS min_id FROM your_table_name GROUP BY date ) t2 ON t1.id = t2.min_id;
- 清空原表(注意:一定要先备份表再执行这一步!):
TRUNCATE TABLE your_table_name;
- 将临时表的数据导回原表:
INSERT INTO your_table_name SELECT * FROM temp_unique_dates;
- 删除临时表(可选,会话结束后临时表会自动删除):
DROP TEMPORARY TABLE temp_unique_dates;
关键注意事项&建议
- 操作前必须备份表! 可以用这条语句快速备份:
CREATE TABLE backup_table AS SELECT * FROM your_table_name;,避免误删重要数据。 - 先验证再执行删除操作:比如先运行
SELECT t1.* FROM your_table_name t1 JOIN your_table_name t2 ON t1.date = t2.date AND t1.id > t2.id;,查看哪些行会被删除,确认无误后再执行DELETE。 - 确保
date字段格式统一:如果你的date是字符串类型(比如样本里的2019.02.04 00:00:00),要保证所有日期格式一致,避免因格式差异出现“假重复”或漏删情况。如果是datetime类型会更稳妥。 - 你的MariaDB版本是10.1.34,上面的所有语法都完全兼容,不用担心版本适配问题。
内容的提问来源于stack exchange,提问作者user9281198
相关产品推荐
相关产品推荐

