SQL - 删除所有重复项,但每个用户标识的每组最高

时间:2013-04-27 02:00:14

标签: sql select group-by

我们的偏好表 中似乎有一些重复的值,所以我想删除每个用户的所有重复条目,但是删除最新的 。我花了很长时间试图想出一个解决方案而且我一直在圈子里跑来跑去。我已经尝试了max,分组,子查询等。删除最高的很容易,但不是最高的。特别是对每个用户来说

所以在数据库中我可能有:

id  :   name:       value   :   userId
1   :   sortOrder:  Asc     :   1
2   :   sortOrder:  Desc    :   1
3   :   sortOrder:  Asc     :   2
4   :   something:  value2  :   1

所以在这种情况下,我想删除第一行,因为它对于用户1来说是重复的并且具有最高的id并且保留所有其余的列。

所以我知道它至少是group by的子查询,但我无法理解。到目前为止,我有:

SELECT 
    MAX(id),
    name
FROM 
    preference
GROUP BY
    name

给出了我想要保留的列表,但是它仍然会错过每个用户。所以如果我为每个用户提供它,我有点想要反其道而行之。但是我不相信我可以使用<>反正在子查询中。

我最终要做的就是删除所有那些具有较低ID的同一用户的重复条目。

1 个答案:

答案 0 :(得分:9)

一种方法,假设Id列是唯一的ID:

DELETE FROM preference
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId)

[注意:通常的建议适用。 在没有先测试的情况下在生产中运行]

首先测试:

SELECT * FROM preference
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId)

SQLFiddle是here。按预期工作。我建议使用更大的数据集进行测试......