SQL - объединить повторяющиеся строки по самым последним - PullRequest
0 голосов
/ 29 января 2019

У меня есть большая база данных 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 голосов
/ 29 января 2019

С EXISTS:

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

EXISTS вернет TRUE, как только найдет 1 строку с тем же адресом электронной почты и датой, превышающей текущую строку, поэтому в этом нет необходимостисканировать всю таблицу для каждой строки.

0 голосов
/ 31 января 2019

Вы упомянули, что это большая база данных.Затем я предложу вам добавить индекс в таблицу перед запуском сценария @forpas или @Gordon Linoff, поскольку выполнение этих сценариев может занять много времени при работе с миллионами строк.

Индекс можетбыть созданным так:

CREATE INDEX tablename_index ON tablename (email, created_at);

А потом, если вам больше не нужен индекс, вы можете удалить его так:

DROP INDEX tablename_index ON tablename;
0 голосов
/ 29 января 2019

Как то так?

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