[英]Update a column based on other column with postgresql
我有一个包含以下列的表格:
id integer
sumqty numeric
maxqty numeric
id, sumqty
列由其他功能定期更新。 我需要编写一个传递这两列并更新maxqty
列的maxqty
。
例如:
id, sumqty, maxqty
5 20
5 70
5 45
3 20
1 12
1 2.5
函数运行后,所需的输出将是:
id, sumqty, maxqty
5 20 45
5 10 45
5 45 45
3 20 20
1 12 12
1 2.5 12
我写了这段代码:
update A set maxqty= (select MAX(sumqty) OVER (PARTITION BY id))
但它并不总是有效。 有时候,这并不能给我实际的MAX。
我的代码有什么问题?
改用相关子查询:
UPDATE mytable t1
SET maxqty= (SELECT MAX(sumqty)
FROM mytable t2
WHERE t1.id = t2.id );
结果:
╔═════╦═════════╦════════╗
║ id ║ sumqty ║ maxqty ║
╠═════╬═════════╬════════╣
║ 5 ║ 20 ║ 45 ║
║ 5 ║ 10 ║ 45 ║
║ 5 ║ 45 ║ 45 ║
║ 3 ║ 20 ║ 20 ║
║ 1 ║ 12 ║ 12 ║
║ 1 ║ 2.5 ║ 12 ║
╚═════╩═════════╩════════╝
更有效的方法:
WITH cte AS
(
SELECT id, MAX(sumqty) AS sumqty
FROM mytable
GROUP BY id
)
UPDATE mytable m
SET maxqty = c.sumqty
FROM cte c
WHERE m.id = c.id;
您的原始查询:
update mytable
set maxqty= (select MAX(sumqty) OVER (PARTITION BY id);
得到:
╔═════╦═════════╦════════╗
║ id ║ sumqty ║ maxqty ║
╠═════╬═════════╬════════╣
║ 5 ║ 20 ║ 20 ║
║ 5 ║ 10 ║ 10 ║
║ 5 ║ 45 ║ 45 ║
║ 3 ║ 20 ║ 20 ║
║ 1 ║ 12 ║ 12 ║
║ 1 ║ 2.5 ║ 2.5 ║
╚═════╩═════════╩════════╝
这是因为UPDATE
每行有效。 而且您的子查询只有一行要处理,而不是一堆。
update mytable
set maxqty=t.max
from (select id,max(sumqty) from mytable group by id) t
where t.id=mytable.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.