SQL中与pandas的“transform”等效的是什么?

5
假设您有以下SQL表格:
  A  B  C  
  2  1  4       
  3  4  5     
  3  1  1    
  1  4  0       
  5  0  1 

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

  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

据我所知,在pandas中最好的方法是:

>>> 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吗?

1
为什么要避免使用join?即使在后台,pandas也会执行join :) - WoodChopper
@WoodChopper,FuzzyTree的查询使用子查询或窗口函数比使用连接更有效吗? - drake
1个回答

7
您可以加入一个包含每个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

首先,我忘了说我试图避免使用join,很抱歉。这个可行吗?另外一个问题,为什么你需要“distinct”?我想考虑每个B值的A所有值(唯一和非唯一)。 - drake
@drake mysql不支持窗口函数,所以我认为没有办法在没有子查询或连接的情况下完成它。 - FuzzyTree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接