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

SQL如何处理表中重复值:按ID求和后删除或保留行

这问题我之前处理过类似的,咱们先把需求拆解清楚:

  • 对重复出现的ID,先计算它们对应数值的总和
  • 如果总和为0:删掉这个ID的所有行
  • 如果总和不为0,或者ID本身就只出现一次:保留这些行

下面给你两种常用的实现方式,根据你的需求选就行:

1. 先查看需要保留的行(不修改原表)

如果你想先确认哪些行符合保留条件,可以用这个查询:

WITH id_stats AS (
    SELECT 
        ID,
        SUM(your_value_column) AS total_sum, -- 替换成你实际的数值列名
        COUNT(*) AS occurrence_count
    FROM your_table -- 替换成你的表名
    GROUP BY ID
)
SELECT t.*
FROM your_table t
INNER JOIN id_stats s ON t.ID = s.ID
WHERE (s.occurrence_count > 1 AND s.total_sum != 0) OR s.occurrence_count = 1;

这里的id_stats CTE(公共表表达式)先统计了每个ID的总和和出现次数,然后主查询把原表和统计结果关联,筛选出符合要求的行:要么是重复ID但总和不为0,要么是无重复的ID。

2. 直接删除不符合条件的行(修改原表)

如果要直接清理原表,删掉那些重复且总和为0的ID的所有行,可以用这个语句:

WITH ids_to_remove AS (
    SELECT ID
    FROM your_table
    GROUP BY ID
    HAVING COUNT(*) > 1 AND SUM(your_value_column) = 0 -- 替换数值列名
)
DELETE FROM your_table
WHERE ID IN (SELECT ID FROM ids_to_remove);

这个CTE先找出所有需要删除的ID,然后一次性删掉原表中这些ID的所有行。

兼容旧版本数据库的写法(比如MySQL 8.0之前)

如果你的数据库不支持CTE,可以用子查询代替:

-- 查看保留行
SELECT t.*
FROM your_table t
INNER JOIN (
    SELECT 
        ID,
        SUM(your_value_column) AS total_sum,
        COUNT(*) AS occurrence_count
    FROM your_table
    GROUP BY ID
) s ON t.ID = s.ID
WHERE (s.occurrence_count > 1 AND s.total_sum != 0) OR s.occurrence_count = 1;

-- 删除不需要的行
DELETE FROM your_table
WHERE ID IN (
    SELECT ID
    FROM (
        SELECT ID
        FROM your_table
        GROUP BY ID
        HAVING COUNT(*) > 1 AND SUM(your_value_column) = 0
    ) AS temp_table
);

这里加了一层临时子查询是因为MySQL不允许在DELETE语句中直接引用被操作的表,用临时表包装就解决了这个问题。

⚠️ 注意:操作生产环境数据前一定要先备份,避免误删!

内容的提问来源于stack exchange,提问作者Ika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:14:26