通过一些算术聚合分组(合并相似的行)

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

SQL Fiddle.

您不需要 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)

其余的正在转换和舍入以保留小数位。 (整数除法会截断。)