2016-06-15 2 views
-4

У меня довольно стандартный запрос. У меня есть таблица Mysql, которая содержит кучу данных (около 8000 строк). К сожалению, эта таблица содержит много повторяющихся строк. Эти строки содержат данные, такие как id, first_name, last_name и дату last_modified.Mysql DELETE строки, где даты не самые последние

Наборы «повторяющихся» рядов все содержат одинаковые first_name и last_name, однако; id и last_modified даты все разные.

К счастью, последняя измененная дата - это то, как я могу определить, какая строка в дубликатах на самом деле правильная.

Другими словами, я хотел бы удалить все строки с конкретными first_name и last_name, где дата last_modified не является самой новой.

Например, если у меня есть несколько строк, которые выглядят следующим образом:

1  Bob Smith   2015-04-19 
2  Bob Smith   2016-04-19 
3  Bob Smith   2014-04-19 
4  Richard McDonald 2008-04-19 
5  Joe Blo    2011-04-19 
6  Jo Blo    2010-04-19 

Примечание: Года отличаются так и для каждого человека, только строки с самим последним годом, должно быть сохранено.

Мне нужен запрос, который будет содержать только строку с именем и фамилией, которая является самой новой (последней) датой. Так что, если я пробежал нужный запрос строка будет выглядеть следующим образом после того, как:

2  Bob Smith   2016-04-19 
4  Richard McDonald 2008-04-19 
5  Joe Blo    2011-04-19 

Кто-нибудь может написать мне общий запрос, который может выполнить это? Большое спасибо.

+2

Джо Бло <> Джо Бло – AgRizzo

ответ

1

Вы можете сделать это с delete и join:

delete t 
    from t join 
     (select first_name, last_name, max(last_modified) as maxlm 
      from t 
      group by first_name, last_name 
     ) tt 
     on t.first_name = tt.first_name and t.last_name = tt.last_name and 
      t.last_modified < tt.maxlm;