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