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

标签 sql select group-by

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

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

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 较低的所有用户。

最佳答案

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

关于SQL - 删除所有重复项,但每个用户 ID 的每个组中最高的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247538/

相关文章:

SQL 可选连接和默认值

mysql连接表

mysql - SQL - 如何从内部语句中选择 TOP 5

python - 使用 : groupby ('' ). 变换时出现错误消息(pd.rolling_sum,window=30)

python - 如何旋转数据框

mysql - Group by 和 Sum 缺少数据

mysql - 将多列查询转换为行查询

c# - 文件未以正确格式下载

MySQL 限制偏移差异

selenium - <Select> 标签不适用于在下拉列表中选择值