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

Update a column based on other column with postgresql

我有一个 table 包含以下列:

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。

我的代码有什么问题?

改为使用相关子查询:

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 每行工作。而且您的子查询只有一行要处理,而不是一堆。

update mytable 
set maxqty=t.max 
    from (select id,max(sumqty) from mytable group by id) t
where t.id=mytable.id

SQLFIDDLE