繁体   English   中英

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

[英]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。

我的代码有什么问题?

改用相关子查询:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM