Update using a subquery with aggregates and groupby in Postgres

拥有回忆 提交于 2019-12-02 08:46:27

问题


I'm trying to update a column in a table with the max value of that column grouped by another column.

So for example, say we have a table named transactions with two columns: quantity and item_name. And for whatever reason we want to set quantity equal to the maximum quantity found for each item_name.

I'm pretty stumped and bad at doing things like this in SQL, but here's what I have so far:

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;

回答1:


In addition to your syntax errors that @Gordon already pointed out, it is regularly a good idea to exclude empty updates:

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;

No need to write new row versions (at almost full cost) without changing anything. (Except if you want to fire a trigger.)




回答2:


You are actually quite close:

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;

I just removed the and in where and and renamed the table in the subquery to transactions.




回答3:


Try this, it should also work for you. It would evaluate the quantity for each and every row and may be slower than Gordon's answer.

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


来源:https://stackoverflow.com/questions/22205106/update-using-a-subquery-with-aggregates-and-groupby-in-postgres

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!