1

テーブルの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などを使用して標準偏差を計算しています。WHEREグループは、表示しているグループと同じです。

ここで、MySQLを使用して、行ごとの標準偏差とグループ全体の平均を知りたいと思います。(row1stddev+row2stddev+...)/n

サブクエリを使用してみましたが、達成できるのは単一の値を取得することだけです。MySQLに組み込まれている標準偏差関数が実際に複数の値でどのように機能するかを理解していないと思います。

編集。これは私が探している2つのことです:

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

そしてグループごとの平均(すべての標準偏差の平均):

グループ| avg_stddev 1 | 20,828205 2 | ... 3 | ..。

このポイントは、どのグループで差が最も大きいかを知りたいということです。

4

2 に答える 2

2

mysqlネイティブ関数STDDEV_POPは列のみを受け入れるため、一時テーブルを使用してそれをだます必要があります。このテーブルには、すべての値(標準偏差に関係する)が1行に含まれ、UNION ALL3で使用するためSELECTSに、それぞれが1つの意味のある列になります。行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

私があなたを正しく理解していれば、ビューを作成する必要があります

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 に答える