相当于 pandas 'transform' 的 SQL 是什么?

dra*_*ake 5 mysql sql pandas psql

假设您有以下 SQL 表:

  A  B  C  
  2  1  4       
  3  4  5     
  3  1  1    
  1  4  0       
  5  0  1 
Run Code Online (Sandbox Code Playgroud)

并且您想要添加/显示一个列,其中包含 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
Run Code Online (Sandbox Code Playgroud)

据我所知,在 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
Run Code Online (Sandbox Code Playgroud)

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

Fuz*_*ree 8

您可以联接到包含 b 的每个分组的聚合值的派生表

select * from mytable t1
join (
    select avg(a), b
    from mytable
    group by b
) t2 on t2.b = t1.b
Run Code Online (Sandbox Code Playgroud)

或使用子查询

select *, (select avg(a) from mytable t2 where t2.b = t1.b)
from mytable t1
Run Code Online (Sandbox Code Playgroud)

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

select *, avg(a) over (partition by b) 
from mytable
Run Code Online (Sandbox Code Playgroud)