1

所以,我剛剛問了一個問題:Update using a subquery with aggregates and groupby in Postgres
事實證明,我正在討論我的問題與有缺陷的邏輯。刪除所有行,但每個組的最大值一個

在上述問題的相同情況下,而不是更新所有行以具有最大數量,我想刪除沒有最大數量(和任何重複的最大數量)的行。

本質上,我需要將下面的內容轉換爲只保留每個item_name的最大數量的delete語句。我猜我在這裏需要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

是的,'NOT EXISTS()'是要走的路。另一種方法是使用窗口finction枚舉元組。請注意,兩行可以共享相同的MAX()值。 – wildplasser

回答

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?

+0

哇,我不知道從使用存在刪除!你是男人! – Gus

相關問題