所以,我最近问了一个问题:Update using a subquery with aggregates and groupby in Postgres
事实证明我在解决问题时逻辑有缺陷。
在上述问题的相同场景中,我不想更新所有行以具有最大数量,而是删除没有最大数量的行(以及任何重复的最大数量)。
本质上,我只需将以下内容转换为删除语句,该语句仅保留每个 item_name 的最大数量。我猜我在这里需要 NOT EXISTS
但我不确定如何使用聚合函数来做到这一点。
UPDATE transaction t
SET quantity = sub.max_quantity
FROM (
SELECT item_name, max(quantity) AS max_quantity
FROM transaction
GROUP BY 1
) sub
WHERE t.item_name = sub.item_name
AND t.quantity IS DISTINCT FROM sub.max_quantity;
最佳答案
由于可能有共享相同最大数量的对等点,因此安全路由是带有 window function row_number()
的子查询。 :
DELETE FROM transaction t
USING (
SELECT some_unique_id, row_number() OVER (PARTITION BY item_name
ORDER BY quantity DESC) AS rn
FROM transaction
GROUP BY 1
) sub
WHERE t.some_unique_id = sub.some_unique_id
AND sub.rn > 1;
其中 some_unique_id
可以是任何唯一列或列组合(在 GROUP BY
子句中镜像)。
最终与今天的这个问题非常相似:
Delete rows with duplicates on two fields
如果您的表很大并且您要删除其中的大部分内容,请在此处考虑高级建议:
How to delete duplicate entries?
关于sql - 删除所有行,但每组中值最大的行除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210878/