我有一个表:
PostID | 上传程序 | 点赞|
---|---|---|
1 | James | 18 |
2 | James | 20 |
3 | Johny | 28 |
4 | Johny | 30 |
5 | Rocky | 48|
6 | 洛基 | 68 |
您所做的是正确的。
如果你想要一个新的列,在更新后,你必须区分你的结果:
SELECT Uploader, AverageLikesOfUploader FROM yourtable GROUP BY Uploader, AverageLikesOfUploader
但在任何情况下,你仍然需要每次更新你的数据。这对我来说毫无意义。你为什么要在表中保存一个计算值?我建议你采取以下方式:
如果您不想创建新列:
SELECT
Uploader,
avg(B.Likes) as AverageLikesOfUploader
FROM
yourtable
GROUP BY Uploader
update语句的查询中需要a和B之间存在关系。
update mytable A
set AverageLikesOfUploader = (
select avg(B.Likes)
from mytable B
where B.Uploader = A.Uploader
)
postid | 上传器 | ||||
---|---|---|---|---|---|
1 | James | 2 | James | 20 | 9.00|
3 | Johny | 4 | Johny | 30 | >td style="ext-align:right;">29.00|
6 | Rocky | >td style="text-align:right;">6858.00 |
最简单的方法是在窗口上使用avg
select *, Avg(likes) over(partition by uploader)::int AverageLikesOfUploader
from t
如果你真的想用平均值更新你的表(这不是一个好主意,只需使用上面的查询来获得平均值(,你可以用CTE 应用它
with x as (
select *, Avg(likes) over(partition by uploader) av
from t
)
update t set AverageLikesOfUploader=av
from x
where x.PostId=t.PostId;
看看这个演示小提琴