【问题标题】:mySQL group very large table to eliminate duplicatesmySQL 对非常大的表进行分组以消除重复
【发布时间】:2021-01-08 11:22:43
【问题描述】:

我有一张非常大的桌子,大约有 27 米奥。行和 80 列(主要是浮点数,还有日期时间、整数和文本值)。基本上,除了 2 列(int、text)具有不相等的值外,总是有 4 行具有唯一值。我想将这 4 行分组以减小表格大小。在这一点上,从 2 个具有不相等值的列中保留哪个值并不那么重要。对数据进行分组的最佳方式是什么?

由于表格非常大,因此无法概览数据是否始终完整,即始终有 4 行具有唯一值。有什么好方法可以检查吗?

不幸的是,我是 SQL 的初学者,非常感谢有关如何处理它的任何提示。

【问题讨论】:

  • “减少表格大小”的最终目标是什么?要保留的行“不重要”这一事实令人担忧。 应该重要!!
  • 如果您edit您的问题向我们展示 8-12 个样本行,这将对我们有很大帮助。如果您阅读表规范化,它将对有很大帮助:80 个浮点列很多!

标签: mysql group-by duplicates mysql-workbench


【解决方案1】:

你可以

-- Create new table with the same structure
CREATE TABLE new_table LIKE old_table;
-- Add unique index by all columns except last two
ALTER TABLE new_table ADD UNIQUE index_name (column1, column2, ... , columnN);
-- Copy data from old table ignoring duplicates 
-- (only one row in each group will be inserted)
INSERT IGNORE INTO new_table SELECT * FROM old_table;

然后您可以删除已使用的索引,删除旧表并重命名新表。或者截断旧表并从新表中复制行(将其用作临时表)。

我希望源表上没有外键和/或触发器...

【讨论】:

  • 谢谢秋名。这对我有用,除了我必须将索引的列数减少到 16,因为我得到错误代码:1070。指定的关键部分太多;最多允许 16 个零件。
  • @smue 如果您需要克服上述限制,那么您可以创建生成的(如果服务器版本允许 - 虚拟)列连接所有需要的列并对其进行索引。
【解决方案2】:

此查询为您提供基于唯一列的重复行。将 c1,c2,c3,c4 替换为满足统一的列

select <unique_columns> 
    from (
    select c.*,
      row_number() over (partition by c1,c2,c3,c4 order by c5) rn
    from myTable c
) t
where rn != 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2010-09-25
    • 2015-05-17
    • 2020-09-06
    相关资源
    最近更新 更多