【问题标题】:Delete all rows but one with the greatest value per group删除所有行,但每组中值最大的行除外
【发布时间】: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


【解决方案1】:

由于可以存在共享相同最大数量的对等方,因此安全路由是带有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?

【讨论】:

  • 哇,我不知道从使用中删除存在!你就是男人!
猜你喜欢
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2010-09-13
相关资源
最近更新 更多