基于JSON字段属性删除重复行(保留最后一行)的SQL实现需求
我来帮你搞定这个根据JSON字段name属性去重、保留最新记录的需求!核心思路是先定位每个name对应的最后一条有效记录,再删除其余重复的旧数据,下面分数据库场景给你具体方案:
根据JSON字段name属性去重,保留最新记录
假设你的表中id是自增主键(数值越大代表记录越新),我们分步骤实现:
PostgreSQL 方案
PostgreSQL对JSON字段的处理用->>可以直接提取字符串格式的属性值:
1. 先确认要保留的目标记录
先运行这条SQL,验证每个name对应的最大id(也就是要保留的最后一条记录)是否正确:
SELECT (content ->> 'name') AS name_value, MAX(id) AS keep_id FROM your_table_name GROUP BY (content ->> 'name');
2. 删除重复的旧记录
用上面的结果作为筛选条件,删除不在keep_id集合里的记录:
DELETE FROM your_table_name WHERE id NOT IN ( SELECT MAX(id) FROM your_table_name GROUP BY (content ->> 'name') );
优化提示:如果表数据量很大,用CTE(公共表表达式)会更高效:
WITH keep_records AS ( SELECT MAX(id) AS keep_id FROM your_table_name GROUP BY (content ->> 'name') ) DELETE FROM your_table_name WHERE id NOT IN (SELECT keep_id FROM keep_records);
MySQL 方案
MySQL 5.7+支持用content->>'$.name'提取JSON中的name属性,删除操作推荐用多表关联的方式:
1. 确认要保留的目标记录
SELECT content->>'$.name' AS name_value, MAX(id) AS keep_id FROM your_table_name GROUP BY content->>'$.name';
2. 删除重复的旧记录
DELETE t1 FROM your_table_name t1 LEFT JOIN ( SELECT MAX(id) AS keep_id FROM your_table_name GROUP BY content->>'$.name' ) t2 ON t1.id = t2.keep_id WHERE t2.keep_id IS NULL;
重要注意事项
- 操作前务必备份数据!删除操作不可逆,建议先运行
SELECT * FROM your_table_name WHERE id NOT IN (...)(对应PostgreSQL)或SELECT t1.* FROM your_table_name t1 LEFT JOIN ... WHERE t2.keep_id IS NULL(对应MySQL),确认要删除的记录完全符合预期。 - 如果你的表不是用
id判断记录新旧,而是有create_time这类时间字段,只需把MAX(id)替换成MAX(create_time),再关联主键进行删除即可。
内容的提问来源于stack exchange,提问作者galiolio
相关产品推荐
相关产品推荐

