在Postgres中使用带有聚合和分组的子查询进行更新

时间:2014-03-05 17:40:10

标签: sql postgresql sql-update aggregate-functions

我正在尝试更新表格中的列,该列的最大值按另一列分组。

例如,假设我们有一个名为Transactions的表,其中有两列:quantityitem_name。无论出于何种原因,我们希望将quantity设置为等于每个quantity找到的最大item_name

我很难在SQL中做这样的事情,但到目前为止,这是我所拥有的:

UPDATE transactions 
SET
quantity = subquery.quantity
FROM (select max(quantity), item_name
      from transaction group by item_name) AS subquery
WHERE  and item_name = subquery.item_name;

3 个答案:

答案 0 :(得分:4)

除了@Gordon已经指出的语法错误之外,排除空更新通常是个好主意:

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 :(得分:2)

你实际上非常接近:

UPDATE transactions 
    SET quantity = subquery.quantity
    FROM (select max(quantity) as quantity, item_name
          from transactions
          group by item_name
         ) subquery
    WHERE transactions.item_name = subquery.item_name;

我刚删除了and中的where and,并将子查询中的表重命名为transactions

答案 2 :(得分:1)

试试这个,它也应该适合你。它会评估每一行的数量,可能比戈登的答案要慢。

UPDATE transactions 
SET quantity = (SELECT MAX(quantity) 
                 FROM transaction as t 
                 WHERE t.item_name = transactions.item_name)