计算MySQL中每行的Z-Score? (简单)

时间:2011-11-15 07:00:52

标签: mysql

我正在寻找一种为MySQL表格中的每一行分配Z-Score(也称为标准分数)的有效方法。

enter image description here

Z = Z-Score
X = Actual value
μ = Mean value
σ = Standard Deviation

我试过了:

SELECT pTime,(M1-AVG(M1))/STD(M1),
             (M2-AVG(M2))/STD(M2),
             (M3-AVG(M3))/STD(M3),
             (M4-AVG(M4))/STD(M4)
 FROM mergebuys;

但结果只有一行。

当只需要计算一次时,必须使用子查询似乎效率很低。

3 个答案:

答案 0 :(得分:5)

SELECT
    mergebuys.pTime,
    (mergebuys.M1 - aggregates.AVGM1) / aggregates.STDM1 AS z1,
    (mergebuys.M2 - aggregates.AVGM2) / aggregates.STDM2 AS z2,
    (mergebuys.M3 - aggregates.AVGM3) / aggregates.STDM3 AS z3,
    (mergebuys.M4 - aggregates.AVGM4) / aggregates.STDM4 AS z4
FROM
    mergebuys
    CROSS JOIN (
        SELECT
            AVG(M1) AS AVGM1,
            STD(M1) AS STDM1,
            AVG(M2) AS AVGM2,
            STD(M2) AS STDM2,
            AVG(M3) AS AVGM3,
            STD(M3) AS STDM3,
            AVG(M4) AS AVGM4,
            STD(M4) AS STDM4
        FROM
            mergebuys
    ) AS aggregates

答案 1 :(得分:1)

因为您正在使用聚合函数。

例如,如果使用Min或Max函数,则表中特定列只能有一个最小值或最大值。 AVG功能也是如此。

这就是为什么聚合函数通常与Group By子句一起使用的原因。

答案 2 :(得分:0)

我正在尝试做同样的事情。 我认为逻辑是对查询结果获得的每个值进行操作

select (value -
  (select avg(value) 
  from table
  group by grouper))/stddev(value)
from table;

我正在考虑使用一些变量来存储标准差或将其从数据库中删除。