我有一个包含多行数据的表格,每一行都有一个日期字段。目前,可能存在日期重复的情况。我需要删除所有重复的行,只保留具有最高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
我有一个包含多行数据的表格,每一行都有一个日期字段。目前,可能存在日期重复的情况。我需要删除所有重复的行,只保留具有最高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);
对于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)几乎总是非常缓慢的。