我有下表:

tbl
source    type    date
---       ---     ---
google    A       2010-02-25
google    A       2013-04-11
facebook  C       2008-10-22
facebook  C       2007-01-28


我只希望每个源都保留一个条目,条件是使用min(date) group by source选择源元组。该表包含数百万条记录,我正在寻找一种删除冗余记录的有效方法。

最佳答案

在MySQL中,您可以使用join执行此操作:

delete t
    from t join
         (select source, min(date) as mindate
          from t
          group by source
         ) tt
         on t.source = tt.source
    where t.date > tt.mindate;


我认为可以提高效率的唯一方法是将聚合结果存储在子查询中并为其添加索引。

我还可以添加该值,而不考虑用于确定要删除的行的计算,从而删除效率低的表中的许多行。通常,我建议采用三步法:


编写查询以生成所需的表,并将结果存储在临时表中。
截断原始表。
重新插入(少得多)的行数。

关于mysql - SQL:如何根据条件从表中删除行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46647567/

10-16 07:39