1

以下是我的一张表的结构:

id | group | val1 | val2 | val3
1  | 1     | 22   | 23   | 60
2  | 1     | 40   | 60   | 80
3  | 2     | 50   | 5    | 70
4  | 2     | ...
5  | 2     | 
6  | 3     | 
...

在我的 PHP 文档中,我通过每行使用 val1+val2+val3 等计算标准偏差,其中组等于我正在显示的组。

现在我想知道,通过使用 MySQL,每行的标准偏差是多少,以及一个组的平均值是多少。(row1stddev+row2stddev+...)/n

我尝试过使用子查询,但我所能实现的只是获得一个值。我想我缺乏理解 MySQL 中内置的标准差函数实际上是如何处理多个值的。

编辑。这是我正在寻找的两件事:

id | group | stddev
1  | 1     | 21,65641
2  | 1     | 20
3  | 2     | 33,29164
4  | 2     | ...
5  | 2     | 
6  | 3     | 

并按组平均(所有 stddev 的平均值):

集团 | avg_stddev 1 | 20,828205 2 | ... 3 | ...

重点是我想知道哪个组的差异最大。

4

2 回答 2

2

由于 mysql 本机函数STDDEV_POP仅接受列,因此您必须通过使用临时表来欺骗它,该表将在一行中有一个包含所有值(与标准偏差有关)的列,用于UNION ALL3 SELECTS,每个用于一个有意义的列,并且按行 ID 分组。

SELECT 
    id,
    STDDEV_POP(val) AS row_stddev 
FROM (
    SELECT id, val1 AS val FROM stdev_table
    UNION ALL
    SELECT id, val2 AS val FROM stdev_table
    UNION ALL
    SELECT id, val3 AS val FROM stdev_table
) tmp0
GROUP BY id

您还可以选择其他列 -group并创建另一个临时表以从中选择平均值:

SELECT 
    id_group,
    AVG(row_stddev) AS group_avg 
FROM (
    SELECT 
        id, 
        id_group, 
        STDDEV_POP(val) AS row_stddev 
    FROM (
        SELECT id, id_group, val1 AS val FROM stdev_table
        UNION ALL
        SELECT id, id_group, val2 AS val FROM stdev_table
        UNION ALL
        SELECT id, id_group, val3 AS val FROM stdev_table
    ) tmp0
    GROUP BY id
) tmp1
GROUP BY id_group
于 2012-12-09T19:15:36.853 回答
1

如果我理解正确,您应该创建 View

CREATE VIEW view_name AS SELECT val1, val2, val3,  val1 + val2 + val 3 / 3 AS average FROM tablename;

然后只是SELECT * FROM view_name为了让您获得价值。

于 2012-12-09T16:54:12.527 回答