所以,我刚刚问了一个问题: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;
答案 0 :(得分:2)
由于可能有对等体共享相同的最大数量,因此安全路径是带有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?