使用 postgresql 更新基于其他列的列

SMW*_*SMW 3 sql postgresql sql-update

我有一个包含以下列的表格:

id  integer
sumqty numeric
maxqty  numeric
Run Code Online (Sandbox Code Playgroud)

这些列id, sumqty由其他功能定期更新。我需要编写一个传递这两列的函数并更新该maxqty列。

例如:

id, sumqty, maxqty
5    20
5    70
5    45
3    20
1    12
1    2.5
Run Code Online (Sandbox Code Playgroud)

函数运行后,所需的输出将是:

id, sumqty, maxqty
5    20      45
5    10      45
5    45      45
3    20      20
1    12      12
1    2.5     12
Run Code Online (Sandbox Code Playgroud)

我写了这段代码:

update A set maxqty= (select MAX(sumqty)  OVER (PARTITION BY id))
Run Code Online (Sandbox Code Playgroud)

但它并不总是有效。有时它不会给我实际的 MAX。

我的代码有什么问题?

Luk*_*zda 5

改用相关子查询:

SqlFiddleDemo

UPDATE mytable t1
SET maxqty= (SELECT MAX(sumqty) 
             FROM mytable t2
             WHERE t1.id = t2.id );
Run Code Online (Sandbox Code Playgroud)

结果:

??????????????????????????
? id  ? sumqty  ? maxqty ?
??????????????????????????
?  5  ? 20      ?     45 ?
?  5  ? 10      ?     45 ?
?  5  ? 45      ?     45 ?
?  3  ? 20      ?     20 ?
?  1  ? 12      ?     12 ?
?  1  ? 2.5     ?     12 ?
??????????????????????????
Run Code Online (Sandbox Code Playgroud)

更有效的方法:

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;
Run Code Online (Sandbox Code Playgroud)

您的原始查询:

update mytable 
set maxqty= (select MAX(sumqty)  OVER (PARTITION BY id);
Run Code Online (Sandbox Code Playgroud)

给出:

??????????????????????????
? id  ? sumqty  ? maxqty ?
??????????????????????????
?  5  ? 20      ? 20     ?
?  5  ? 10      ? 10     ?
?  5  ? 45      ? 45     ?
?  3  ? 20      ? 20     ?
?  1  ? 12      ? 12     ?
?  1  ? 2.5     ? 2.5    ?
??????????????????????????
Run Code Online (Sandbox Code Playgroud)

这是因为UPDATE每行工作。并且您的子查询只有一行要处理而不是一堆。