我有一个包含以下列的表:
id integer
sumqty numeric
maxqty numeric
列id, sumqty
会定期更新其他功能。
我需要编写一个传递这两列的函数并更新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。
我的代码有什么问题?
答案 0 :(得分:1)
改为使用相关子查询:
<强> SqlFiddleDemo 强>
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
每行都有效。而且你的子查询只有一行来处理它们。
答案 1 :(得分:0)
update mytable
set maxqty=t.max
from (select id,max(sumqty) from mytable group by id) t
where t.id=mytable.id