SQL - 按最新的方式合并重复的行

问题描述 投票:0回答:3

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

first_name | last_name | email             | country | created_at
-----------------------------------------------------------------
      john | DOE       | [email protected] | USA     | 2016-05-01
      john | DOE       | [email protected] | FRANCE  | 2019-05-03
       doe | John      | [email protected] | CANADA  | 2011-08-23

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

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

对不起,如果不清楚..

sql sql-update sql-delete
3个回答
4
投票

像这样的东西?

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

1
投票

使用EXISTS

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

EXISTS将在找到1行时使用相同的电子邮件和日期大于当前行返回TRUE,因此不需要扫描每一行的整个表。


0
投票

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

可以像这样创建索引:

CREATE INDEX tablename_index ON tablename (email, created_at);

然后,如果您不再需要索引,可以将其删除如下:

DROP INDEX tablename_index ON tablename;
© www.soinside.com 2019 - 2024. All rights reserved.