【问题标题】:Multiply group by functions mysql乘以函数mysql
【发布时间】:2021-01-25 13:49:14
【问题描述】:

当我试图计算组中的相关性时,问题就出现了。

当我有多个组时,我需要为分子做这样的事情:

sum((x - avg(x)) * (y - avg(y)))

我希望内部 x - avg() 将为每个 x 执行减法。但事实证明我不能像这样在 MySQL 中这样做

select sum((x - avg(x)) * (y - avg(y))) numerator
from tbl t group by group_colk

这使组函数的使用无效。有 3 种方法可以解决这个问题。

  1. 以其他方式布局公式,使其不包含 2 个聚合函数。有时这很困难,因为我无法在网上轻松找到其他表格。
  2. 创建另一个计算内部聚合结果(本例中的平均值)的表。将它与另一个连接到外部(总和)。这种方式会让我加入另一个导致性能损失的表。
  3. 使用变量来存储结果。这将使我多次运行查询以获得结果。

有没有更好的方法来解决这个问题?尚未尝试子查询,但根据我过去的经验,子查询似乎比加入另一个表更损害性能。

【问题讨论】:

  • 你明白了。你的乐观是错误的。
  • @P.Salmon 这是我使用的第三种方法。还不是我想要的。我已经这样做了,但是部署开销太大,所以我想要一个查询来完成工作..
  • @草莓哈哈。我经常使用 python,所以我认为这是一个常识。这个想法是,当我执行 x-avg(x) 时,我想要某种方法不会将组“折叠”成一行,而是在总结时执行。
  • '但是脚本的开销太大了。' - 怎么会这样?有代表性的样本数据和预期结果会有所帮助,尤其是对于那些在十年或四年内没有做过困难计算的人。

标签: mysql group-by aggregate-functions


【解决方案1】:

预先计算平均值,然后开始研究主要公式:

select grp, sum((x - avgx) * (y - avgy)) numerator
    FROM ( SELECT grp,
                  avg(x) AS avgx, 
                  avg(y) AS avgy
              FROM tbl
         ) AS z
    JOIN tbl  USING(grp)
    group by grp;

假设工作正常,增强它以完成整个公式:

 SELECT grp, ( sum((..)*(..)) ) /
             ( SQRT( ... ) )  as Correlation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多