通过一些算术聚合分组(合并相似的行)
Group by aggregate with some arithmetics (merging similar rows)
我需要合并以下行:
id num_votes avg_vote
1 2 4
1 3 1
1 0 0
最后:
id num_votes avg_votes
1 2+3+0=5 4*2/5 + 3*1/5 = 2.2
我试过以下方法,聚合嵌套函数当然不起作用:
select id
, sum(num_votes) as _num_votes
, sum(num_votes/sum(num_votes)*avg_vote) as _avg_vote
from mytable
GROUP BY id, num_votes, avg_vote;
SELECT id
, sum(num_votes) as _num_votes
, round( sum(num_votes * avg_vote)::numeric
/ sum(num_votes)
, 2) AS avg_votes
FROM mytable
GROUP BY id; -- you cannot GROUP BY aggregated columns, just: id
您不需要 window 函数。聚合函数完成这项工作。
计算:
4*2/5 + 3*1/5 + 0*0/5
可以重写为:
(4*2 + 3*1 + 0*0)/5
并实现为:
sum(num_votes * avg_vote) / sum(num_votes)
其余的正在转换和舍入以保留小数位。 (整数除法会截断。)
我需要合并以下行:
id num_votes avg_vote
1 2 4
1 3 1
1 0 0
最后:
id num_votes avg_votes
1 2+3+0=5 4*2/5 + 3*1/5 = 2.2
我试过以下方法,聚合嵌套函数当然不起作用:
select id
, sum(num_votes) as _num_votes
, sum(num_votes/sum(num_votes)*avg_vote) as _avg_vote
from mytable
GROUP BY id, num_votes, avg_vote;
SELECT id
, sum(num_votes) as _num_votes
, round( sum(num_votes * avg_vote)::numeric
/ sum(num_votes)
, 2) AS avg_votes
FROM mytable
GROUP BY id; -- you cannot GROUP BY aggregated columns, just: id
您不需要 window 函数。聚合函数完成这项工作。
计算:
4*2/5 + 3*1/5 + 0*0/5
可以重写为:
(4*2 + 3*1 + 0*0)/5
并实现为:
sum(num_votes * avg_vote) / sum(num_votes)
其余的正在转换和舍入以保留小数位。 (整数除法会截断。)