我有一張桌子:
| 郵編 | 上傳者 | 喜歡 |
|---|---|---|
| 1 | 詹姆士 | 18 |
| 2 | 詹姆士 | 20 |
| 3 | 約翰尼 | 28 |
| 4 | 約翰尼 | 30 |
| 5 | 洛基 | 48 |
| 6 | 洛基 | 68 |
我想在最后添加一個新列,其中包含每個帖子上傳者的平均點贊數。因此,如果 James 平均有 19 個贊,我希望第 1 行和第 2 行中都有 19 個。
我正在嘗試這個:
update mytable A
set "AverageLikesOfUploader" =
(
select avg(B.Likes)
from mytable B
group by B.Uploader
)
但它沒有用。
我該怎么做才能得到這個結果:
| 郵編 | 上傳者 | 喜歡 | 上傳者平均點贊數 |
|---|---|---|---|
| 1 | 詹姆士 | 18 | 19 |
| 2 | 詹姆士 | 20 | 19 |
| 3 | 約翰尼 | 28 | 29 |
| 4 | 約翰尼 | 30 | 29 |
| 5 | 洛基 | 48 | 58 |
| 6 | 洛基 | 68 | 58 |
uj5u.com熱心網友回復:
你做的是對的。
如果你想要一個新列,在你做的更新之后,你必須區分你的結果:
SELECT Uploader, AverageLikesOfUploader FROM yourtable GROUP BY Uploader, AverageLikesOfUploader
但無論如何,您仍然必須每次都更新您的資料。這對我來說毫無意義。為什么要在表中保存計算值?我建議你通過以下方式:
如果您不想創建新列:
SELECT
Uploader,
avg(B.Likes) as AverageLikesOfUploader
FROM
yourtable
GROUP BY Uploader
uj5u.com熱心網友回復:
更新陳述句的查詢中需要A和B之間存在關系。
update mytable A
set AverageLikesOfUploader = (
select avg(B.Likes)
from mytable B
where B.Uploader = A.Uploader
)
| postid | 上傳者 | 喜歡 | 平均喜歡上傳者 |
|---|---|---|---|
| 1 | 詹姆士 | 18 | 19.00 |
| 2 | 詹姆士 | 20 | 19.00 |
| 3 | 約翰尼 | 28 | 29.00 |
| 4 | 約翰尼 | 30 | 29.00 |
| 5 | 洛基 | 48 | 58.00 |
| 6 | 洛基 | 68 | 58.00 |
db<>在這里擺弄
uj5u.com熱心網友回復:
最簡單的方法是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;
看到這個演示小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/363756.html
標籤:sql PostgreSQL的
