删除除具有最大值的行之外的所有行
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:如何删除重复的行,但保留所有行的最大值[重复]