PostgreSQL数据库中如何添加按上传者分组的点赞平均值新列?
问题原因
你编写的SQL执行失败的核心问题是子查询未和外层更新行做Uploader关联,group by后会返回每个上传者对应的平均点赞结果(多条数据),数据库无法判断该给当前行匹配哪条结果,因此执行报错。
操作步骤
步骤1:新增目标列
首先需要给表添加AverageLikesOfUploader列,数值类型可根据需要调整为FLOAT/DECIMAL,示例语句:
ALTER TABLE mytable ADD COLUMN AverageLikesOfUploader INT;
步骤2:执行更新
提供两种通用兼容写法:
写法1:关联子查询写法(兼容所有主流SQL数据库)
在子查询中添加外层关联条件,保证每次只返回当前行上传者的平均点赞:
UPDATE mytable A SET AverageLikesOfUploader = ( SELECT AVG(B.Likes) FROM mytable B WHERE B.Uploader = A.Uploader );
写法2:JOIN更新写法(性能更优,适合数据量较大的场景,支持MySQL 8+、PostgreSQL等)
先聚合计算每个上传者的平均点赞,再批量关联更新:
UPDATE mytable JOIN ( SELECT Uploader, AVG(Likes) AS avg_likes FROM mytable GROUP BY Uploader ) AS uploader_avg ON mytable.Uploader = uploader_avg.Uploader SET mytable.AverageLikesOfUploader = uploader_avg.avg_likes;
最终效果
更新后表的结果如下:
| PostID | Uploader | Likes | AverageLikesOfUploader |
|---|---|---|---|
| 1 | James | 18 | 19 |
| 2 | James | 20 | 19 |
| 3 | Johny | 28 | 29 |
| 4 | Johny | 30 | 29 |
| 5 | Rocky | 48 | 58 |
| 6 | Rocky | 68 | 58 |
内容的提问来源于stack exchange,提问作者ssy
相关产品推荐
相关产品推荐

