Ответ 1
DELETE FROM table WHERE id NOT IN
(SELECT MAX(id) FROM table GROUP BY date);
У меня есть таблица с несколькими строками. Каждая строка имеет поле даты. Сейчас это могут быть дубликаты даты. Мне нужно удалить все дубликаты и сохранить только строку с наивысшим 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
DELETE FROM table WHERE id NOT IN
(SELECT MAX(id) FROM table GROUP BY date);
У меня нет комментариев, поэтому здесь мой комментарий как ответ в случае, если кто-то сталкивается с той же проблемой:
В SQLite3 имеется неявный числовой первичный ключ, называемый "rowid", поэтому тот же запрос будет выглядеть так:
DELETE FROM table WHERE rowid NOT IN
(SELECT MAX(rowid) FROM table GROUP BY date);
это будет работать с любой таблицей, даже если она не содержит столбца первичного ключа с именем "id".
Для 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) почти всегда очень медленные.