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

通过SQL遍历重复产品对并按频次更新product_id字段

批量更新重复产品ID的解决方案

步骤1:导入重复产品对到临时表

先把CSV里的重复产品对导入数据库临时表,方便批量处理。首先创建临时表:

CREATE TEMPORARY TABLE duplicate_pairs (
  product_a INT,
  product_b INT
);

根据你使用的数据库导入CSV数据:

  • MySQL:用LOAD DATA INFILE命令导入
  • PostgreSQL:用COPY命令导入
  • SQL Server:用BULK INSERT命令导入

如果CSV里有重复的产品对,先去重再导入:

-- 假设已将CSV导入临时表temp_csv,执行去重插入
INSERT INTO duplicate_pairs
SELECT DISTINCT product_a, product_b FROM temp_csv;

步骤2:预计算每个Product ID的出现频次

提前统计所有product_id的频次,避免更新时重复计算,提升效率:

CREATE TEMPORARY TABLE product_counts AS
SELECT 
  product_id,
  COUNT(DISTINCT ID) AS occurrence_count
FROM product_case
GROUP BY product_id;

步骤3:批量执行更新操作

通过关联临时表,一次性处理所有重复产品对的更新:

UPDATE product_case pc
JOIN duplicate_pairs dp 
  ON pc.product_id IN (dp.product_a, dp.product_b)
JOIN product_counts ca 
  ON ca.product_id = dp.product_a
JOIN product_counts cb 
  ON cb.product_id = dp.product_b
SET pc.product_id = 
  CASE 
    WHEN ca.occurrence_count > cb.occurrence_count THEN dp.product_a
    WHEN cb.occurrence_count > ca.occurrence_count THEN dp.product_b
    ELSE dp.product_a -- 频次相等时默认保留product_a,可根据需求修改
  END
WHERE pc.product_id = 
  CASE 
    WHEN ca.occurrence_count > cb.occurrence_count THEN dp.product_b
    WHEN cb.occurrence_count > ca.occurrence_count THEN dp.product_a
    ELSE pc.product_id -- 频次相等时不更新,可调整逻辑
  END;

注意事项

  • 操作前必备份数据:更新操作不可逆,先导出product_case表备份,避免数据丢失。
  • 不同数据库语法差异:如果使用PostgreSQL,更新语句需要调整为:
    UPDATE product_case pc
    SET product_id = 
      CASE 
        WHEN ca.occurrence_count > cb.occurrence_count THEN dp.product_a
        WHEN cb.occurrence_count > ca.occurrence_count THEN dp.product_b
        ELSE dp.product_a
      END
    FROM duplicate_pairs dp
    JOIN product_counts ca ON ca.product_id = dp.product_a
    JOIN product_counts cb ON cb.product_id = dp.product_b
    WHERE pc.product_id IN (dp.product_a, dp.product_b)
      AND pc.product_id = 
        CASE 
          WHEN ca.occurrence_count > cb.occurrence_count THEN dp.product_b
          WHEN cb.occurrence_count > ca.occurrence_count THEN dp.product_a
          ELSE pc.product_id
        END;
    
  • 如果重复对存在多层关联(比如A和B重复,B和C重复),需要先处理完所有对,或者调整逻辑合并为同一个ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:12:38