删除除具有最大值的行之外的所有行

Posted

技术标签:

【中文标题】删除除具有最大值的行之外的所有行【英文标题】:Delete all rows except the one with the biggest value 【发布时间】:2016-04-08 16:11:17 【问题描述】:

我将交易存储在一个表中,我想删除所有交易(按 user_id 分组),除了金额最大的交易,这里是一个示例表:

+----+---------+--------+
| id | user_id | amount |
+----+---------+--------+
| 1  | 1       | 10     |
+----+---------+--------+
| 2  | 1       | 20     |
+----+---------+--------+
| 3  | 1       | 30     |
+----+---------+--------+
| 4  | 2       | 50     |
+----+---------+--------+
| 5  | 2       | 100    |
+----+---------+--------+
| 6  | 3       | 2      |
+----+---------+--------+
| 7  | 3       | 4      |
+----+---------+--------+

我想要以下结果

+----+---------+--------+
| id | user_id | amount |
+----+---------+--------+
| 3  | 1       | 30     |
+----+---------+--------+
| 5  | 2       | 100    |
+----+---------+--------+
| 7  | 3       | 4      |
+----+---------+--------+

我试过了

DELETE FROM `transactions`
WHERE `user_id` NOT IN (
  SELECT `user_id`
  FROM (
    SELECT MAX(`amount`) AS ts
    FROM `transactions` e
    WHERE `user_id` = `user_id`
  ) s
  WHERE ts = `transactions`.`amount`
)
ORDER BY `transactions`.`user_id` ASC

【问题讨论】:

How to delete duplicates on a mysql table?的可能重复 也许用删除的标志更新而不是删除它们。 @Gerfried 我不想删除重复值,我想删除除较大金额之外的所有值示例:用户有 4 笔交易,1- 10 美元 2- 20 美元 3- 40 美元我想删除 1 和 2 并保留 40 美元 【参考方案1】:
DELETE FROM `transactions`
WHERE id NOT IN 
(
    SELECT MAX(id)
    FROM `transactions`
    group by user_id
)

每个用户的内部查询组,并且只为每个用户选择最高 ID。从内部选择中删除除 ID 之外的所有记录。

【讨论】:

【参考方案2】:

不确定except the latest one 是什么意思,所以我考虑了except last record inserted,因此使用了ORDER BY id DESC

DELETE FROM `transactions`
WHERE `id` NOT IN (
    SELECT `id`
    FROM `transactions`
    GROUP BY `user_id`
    ORDER BY `id` DESC
)

【讨论】:

以上是关于删除除具有最大值的行之外的所有行的主要内容,如果未能解决你的问题,请参考以下文章

编写 SQL 查询,选择除同时在三列中具有指定值的行之外的所有行

Pandas:如何删除重复的行,但保留所有行的最大值[重复]

从表中删除具有最大日期的行

为每个 id 删除除一个之外的行

删除/隐藏 UIDatePicker 最小/最大日期范围之外的行?

根据条件对 BigQuery 中的行进行重复数据删除