假设您具有以下SQL表:

  A  B  C
  2  1  4
  3  4  5
  3  1  1
  1  4  0
  5  0  1


并且您想要添加/显示一列,其中包含B列的每个不同值的A列的平均值(或任何其他聚合函数)。您想保留所有列。因此结果将如下所示:

  A  B  C    avg(A)|B
  2  1  4       2.5
  3  4  5       2.0
  3  1  1       2.5
  1  4  0       2.0
  5  0  1       5.0


据我所知,在熊猫中做到这一点的最好方法是:

>>> df['avg(A)|B'] = df.groupby('B')['A'].transform('mean')
>>> df
   A  B  C  avg(A)|B
0  2  1  4       2.5
1  3  4  5       2.0
2  3  1  1       2.5
3  1  4  0       2.0
4  5  0  1       5.0


您将如何在SQL中做到这一点?可以避免使用JOIN吗?

最佳答案

您可以加入一个派生表,该表包含每个b组的合计值

select * from mytable t1
join (
    select avg(a), b
    from mytable
    group by b
) t2 on t2.b = t1.b


或使用子查询

select *, (select avg(a) from mytable t2 where t2.b = t1.b)
from mytable t1


这个问题同时被标记为mysql和psql,所以我不确定您使用的是哪个数据库。但是在postgres上,您可以使用窗口函数

select *, avg(a) over (partition by b)
from mytable

关于mysql - 与pandas'transform'等效的SQL是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33730092/

10-11 22:22
查看更多