gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:26:26 25 4
gpt4 key购买 nike

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

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

关于sql - 使用 postgresql 更新基于其他列的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33097228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com