sql - 在 pgSQL 中结合 UPDATE 和 WINDOW
问题描述
我正在努力实现以下目标:
从下表开始
id town x y
1 A 1.0 1.0
2 A 2.0 3.5
3 A 4.0 2.0
4 B 6.0 8.0
5 B 7.5 8.5
我想用两个新列更新它,其中包含城镇 A 和 B 的 x 和 y 平均值,如下所示
id town x y avg_x avg_y
1 A 1.0 1.0 2.3333 2.1666
2 A 2.0 3.5 2.3333 2.1666
3 A 4.0 2.0 2.3333 2.1666
4 B 6.0 8.0 6.75 8.25
5 B 7.5 8.5 6.75 8.25
我使用 ALTER 语句创建了两个新列,然后尝试了以下操作:
UPDATE table
SET (avg_x, avg_y) =
(SELECT AVG(x) OVER w, AVG(y) OVER w
FROM table
WINDOW w AS (PARTITION BY town));
返回我:错误:用作表达式的子查询返回的不止一行 SQL 状态:21000
我被困住了,非常感谢帮助。
解决方案
只需使用聚合:
update t
set avg_x = tt.avg_x,
avg_y = tt.avg_y
from (select town, avg(x) as avg_x, avg(y) as avg_y
from t
group by town
) tt
where t.town = tt.town;
或者不要打扰,只需在需要时即时计算价值。
推荐阅读
- sql-server - 播放框架进化脚本错误行号
- c++ - 计算一系列数字中 3 的数量
- c - 如何将 go slice 复制到 c 指针中
- python - 没有库的python中的货架对象
- node.js - 如何用 fetch api 正确替换 axios api 并映射 nodeJS 中接收到的数据?
- azure - 检测 Azure blob 中的新文件并将该条目插入(调用 sp proc)到 azure sql
- spring-boot - Spring Boot - 如何在事务范围之外调用另一个方法
- gstreamer - GStreamer 和 RTSP 流
- azure - 如何筛选 Azure 审核
- reactjs - 如何解决 React 构建的问题