mysql - 根据字段中的值删除重复行

标签 mysql duplicates min

我有一个非常大的表(几百万条记录)。某些记录具有重复项(基于 FieldA),唯一的区别是 FiedldB 中的值。我想创建一个查询,该查询将删除基于 FieldA 的所有重复记录,保留 FieldB 中具有最低值的记录。这可能吗?

最佳答案

CREATE TABLE TABLE1
  (
    FieldA VARCHAR2(30),
    FieldB VARCHAR2(30),
    FieldC VARCHAR2(30)
  );

INSERT INTO TABLE1 VALUES
  ('DUMMYDATA-A1','DUMMYDATA-B1','DUMMYDATA-C1'
  );
INSERT INTO TABLE1 VALUES
  ('DUMMYDATA-A1','DUMMYDATA-B4','DUMMYDATA-C1'
  );
INSERT INTO TABLE1 VALUES
  ('DUMMYDATA-A1','DUMMYDATA-B3','DUMMYDATA-C1'
  );
INSERT INTO TABLE1 VALUES
  ('DUMMYDATA-A1','DUMMYDATA-B2','DUMMYDATA-C1'
  );
COMMIT;

SELECT FieldA,
  FieldB,
  FieldC,
  RANK() OVER( PARTITION BY FieldA ORDER BY FieldB ASC) AS COLUMN_ALIAS
FROM TABLE1; --IDENTIFIES DUPLICATES BASED ON RANK VALUE

---PERFORM DELETE
DELETE
FROM TABLE1
WHERE ROWID IN
  (SELECT ROWID
  FROM
    (SELECT ROWID,
      RANK() OVER( PARTITION BY FieldA ORDER BY FieldB ASC) AS COLUMN_ALIAS
    FROM TABLE1
    )
  WHERE COLUMN_ALIAS>1
  );

COMMIT;

SELECT * FROM TABLE1; -- CONTAINS A SINGLE RECORD

RANK函数可以识别重复记录,并方便只删除重复记录,保留原始行。这已经在这里讨论过:Deleting duplicates rows from oracle 。希望这有帮助

但是,由于 DELETE 本身较慢,因此可以在这种情况下(包含数百万条记录)在 INSERT 处实现适当的约束,以避免重复输入。

关于mysql - 根据字段中的值删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29446992/

相关文章:

python - 我需要读取 CSV 文件,然后写入一个包含 0 个重复项的新 CSV 文件

Python Pandas 删除重复的单元格 - 保留行

grails:BigDecimal 类型的最小约束和属性(类型不匹配?)

java - 将二维数组的最小列复制到一维数组java

mysql - 我可以将 mysql 服务器的默认编码从 latin-1 更改为 utf-8 吗?

php - 插入 YouTube 链接并仅显示 ID

mysql - hibernate中带注释的查询

php - 存储服务器端数据的最佳方式?

python - 删除列中的重复字符

c - 这段代码缺少什么,对吗?