删除所有行,但每个组的值最大

时间:2014-03-05 22:35:00

标签: sql postgresql greatest-n-per-group window-functions sql-delete

所以,我刚刚问了一个问题: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;

1 个答案:

答案 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?