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

Posted

技术标签:

【中文标题】SQL - 删除所有重复项,但每个用户 ID 的每个组的最高值【英文标题】:SQL - Delete all duplicates but the highest of each group for each user ID 【发布时间】:2013-04-21 06:47:32 【问题描述】:

看起来我们的偏好表中可能有一些重复的值所以我想删除每个用户的所有重复条目,但最近的一个。我花了很长时间试图想出一个解决方案,但我一直在转圈。我已经尝试过最大值、分组依据、子查询等。删除最高的很容易,但除了最高的以外,不是所有的。尤其是对于每个用户

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

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 的重复条目。

【问题讨论】:

GROUP BY userID 如果您希望每个用户也可以。 【参考方案1】:

一种方法,假设 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。按预期工作。不过我建议使用更大的数据集进行测试...

【讨论】:

在不先使用 select 的情况下运行删除只是自找麻烦 ;) 这就是我提到它的原因。 这就是我缺少的 NOT IN 和第二组。不知道您可以在同一个选择中进行第二次分组。谢谢你:)

以上是关于SQL - 删除所有重复项,但每个用户 ID 的每个组的最高值的主要内容,如果未能解决你的问题,请参考以下文章

删除每个分区的重复项

SQL查询,如何去除重复的记录?

如何根据某个字段从数据库表中删除重复项

删除一张表中重复数据并保留一条ID最小的记录

删除mysql中所有重复的行

通过相加删除重复项 [SQL]