我正在尝试更新表格中的列,该列的最大值按另一列分组。
例如,假设我们有一个名为Transactions的表,其中有两列:quantity
和item_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;
答案 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)