Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Update using a subquery with aggregates and groupby in Postgres

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;
like image 975
Gus Avatar asked Mar 20 '26 22:03

Gus


2 Answers

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.)

like image 69
Erwin Brandstetter Avatar answered Mar 23 '26 19:03

Erwin Brandstetter


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)
like image 29
user2989408 Avatar answered Mar 23 '26 21:03

user2989408



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!