You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:02:38