SQL - 按最近合并重复行

SQL - Merge duplicate rows by the most recent

我有一个很大的 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

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

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

不清楚的地方还请见谅..

是这样的吗?

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

EXISTS:

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

EXISTS 将 return TRUE 一旦找到具有相同电子邮件和日期的 1 行大于当前行,因此它不需要扫描整个 table 每行。

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

索引可以这样创建:

CREATE INDEX tablename_index ON tablename (email, created_at);

之后,如果您不再需要索引,可以这样删除它:

DROP INDEX tablename_index ON tablename;