【发布时间】:2014-03-06 09:05:44
【问题描述】:
所以,我最近问了一个问题: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;
【问题讨论】:
-
是的,
NOT EXISTS()是要走的路。另一种方法是使用窗口函数枚举元组。请注意,两行可以共享相同的 MAX() 值。
标签: sql postgresql greatest-n-per-group window-functions sql-delete