使用 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。
我的代码有什么问题?
改为使用相关子查询:
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
我有一个 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。
我的代码有什么问题?
改为使用相关子查询:
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