通过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
相关产品推荐
相关产品推荐

