【问题标题】:What is the SQL equivalent to pandas 'transform'?与 pandas 'transform' 等效的 SQL 是什么?
【发布时间】:2016-02-17 05:44:37
【问题描述】:

假设您有以下 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

据我所知,在 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 吗?

【问题讨论】:

  • 你为什么要避免加入?即使在后台熊猫也会加入:)
  • @WoodChopper 使用子查询或窗口函数的 FuzzyTree 查询不是比连接更有效吗?

标签: mysql sql pandas psql


【解决方案1】:

您可以连接到包含每个 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,所以我不确定你使用的是哪个 db。但是在 postgres 上你可以使用窗口函数

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

【讨论】:

  • 首先,我忘了说我试图避免加入,抱歉。可能吗?在另一个问题上,你为什么需要'distinct'?我想为 B 的每个值考虑 A 的所有值(唯一而不是唯一)。
  • @drake mysql 不支持窗口函数,所以我认为没有子查询或加入的方法
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 2019-06-26
  • 2011-03-11
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
相关资源
最近更新 更多