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。
我的代码有什么问题?
改用相关子查询:
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每行工作。并且您的子查询只有一行要处理而不是一堆。
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |