我有一个包含一些行的表。每行都有一个日期字段。现在,它可能是日期的重复。我需要删除所有重复项,并仅存储具有最高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
答案 0 :(得分:33)
DELETE FROM table WHERE id NOT IN
(SELECT MAX(id) FROM table GROUP BY date);
答案 1 :(得分:6)
我没有评论权,所以这是我的评论作为答案,以防任何人遇到同样的问题:
在SQLite3中,有一个名为“rowid”的隐式数字主键,因此相同的查询将如下所示:
DELETE FROM table WHERE rowid NOT IN
(SELECT MAX(rowid) FROM table GROUP BY date);
这将适用于任何表,即使它不包含名为“id”的主键列。
答案 2 :(得分: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聚合(max,group by)函数几乎总是很慢。