Как удалить повторяющиеся строки с помощью SQL?

У меня есть таблица с несколькими строками. Каждая строка имеет поле даты. Сейчас это могут быть дубликаты даты. Мне нужно удалить все дубликаты и сохранить только строку с наивысшим id. Как это возможно с помощью SQL-запроса?

Сейчас:

date      id
'07/07'   1
'07/07'   2
'07/07'   3
'07/05'   4
'07/05'   5

Что я хочу:

date      id
'07/07'   3
'07/05'   5

Ответ 1

DELETE FROM table WHERE id NOT IN
    (SELECT MAX(id) FROM table GROUP BY date);

Ответ 2

У меня нет комментариев, поэтому здесь мой комментарий как ответ в случае, если кто-то сталкивается с той же проблемой:

В SQLite3 имеется неявный числовой первичный ключ, называемый "rowid", поэтому тот же запрос будет выглядеть так:

DELETE FROM table WHERE rowid NOT IN
(SELECT MAX(rowid) FROM table GROUP BY date);

это будет работать с любой таблицей, даже если она не содержит столбца первичного ключа с именем "id".

Ответ 3

Для mysql, postgresql, oracle лучший способ - SELF JOIN.

Postgresql:
DELETE FROM table t1 USING table t2 WHERE t1.date=t2.date AND t1.id<t2.id;

MySQL        
DELETE FROM table
USING table, table as vtable
WHERE (table.id < vtable.id)
AND (table.date=vtable.date)

Функции SQL aggregate (max, group by) почти всегда очень медленные.