SQL-按最近的日期合并重复的行

时间:2019-01-29 17:07:20

标签: sql sql-update sql-delete

例如,我有一个带有这些表的大型SQL数据库:

first_name | last_name | email             | country | created_at
-----------------------------------------------------------------
      john | DOE       | johndoe@email.com | USA     | 2016-05-01
      john | DOE       | johndoe@email.com | FRANCE  | 2019-05-03
       doe | John      | johndoe@email.com | CANADA  | 2011-08-23

以前的数据库是在没有唯一电子邮件的情况下构建的(是的,这太可怕了)。 因此,我需要用相同的电子邮件将用户合并,但将最新记录与不同的数据合并。

然后通过删除较旧的数据库并保留最新的数据库来更新数据库。

如果不清楚,不好意思。

3 个答案:

答案 0 :(得分:4)

像这样吗?

delete t
    where t.created_at < (select max(t2. created_at)
                          from t t2
                          where t2.email = t.email
                         );

答案 1 :(得分:1)

使用EXISTS

delete tablename t
where exists (
  select 1 from tablename where email = t.email and created_at > t.created_at
)

EXISTS将在发现1行具有相同电子邮件并且日期大于当前行的日期后立即返回TRUE,因此不需要扫描整个表的每一行。

答案 2 :(得分:0)

您提到这是一个很大的数据库。然后,我建议您在通过@forpas或@Gordon Linoff运行脚本之前,在表上添加索引,因为处理数百万行时这些脚本可能需要很长时间才能完成。

可以这样创建索引:

CREATE INDEX tablename_index ON tablename (email, created_at);

然后,如果您不再需要该索引,则可以像这样删除它:

DROP INDEX tablename_index ON tablename;