MYSQL按其他列加权平均

MYSQL按其他列加权平均,mysql,Mysql,我试图得到mysql表中5列的加权平均值。通过获取所有行并在php中计算,我成功地做到了这一点 然而,由于我的表现在有超过2.000.000行,并且查询很少有20.000行,所以它运行缓慢 基本上,如果行的weight\u索引为1,则行:列的值应为0.5,如果行的weight\u索引为2,则行:列的值应为1。 然后计算a、b、c、d和e列的平均值 +----+----------+---+---+---+----+---+--------------+ | id | store_id | a |

我试图得到mysql表中5列的加权平均值。通过获取所有行并在php中计算,我成功地做到了这一点

然而,由于我的表现在有超过2.000.000行,并且查询很少有20.000行,所以它运行缓慢

基本上,如果行的
weight\u索引为1,则行:列的值应为0.5,如果行的
weight\u索引为2,则行:列的值应为1。

然后计算a、b、c、d和e列的平均值

+----+----------+---+---+---+----+---+--------------+
| id | store_id | a | b | c |  d | e | weight_index |
+----+----------+---+---+---+----+---+--------------+
|  1 |     1    | 2 | 3 | 4 |  5 | 6 |       1      |
+----+----------+---+---+---+----+---+--------------+
|  2 |     1    | 3 | 4 | 1 |  2 | 0 |       2      |
+----+----------+---+---+---+----+---+--------------+
|  3 |     1    | 4 | 3 | 1 | 10 | 5 |       3      |
+----+----------+---+---+---+----+---+--------------+
|  4 |     1    | 2 | 3 | 4 |  5 | 6 |       2      |
+----+----------+---+---+---+----+---+--------------+

$weight_index = [1 => 0.5, 2 => 1, 3 => 1, 4 => 1, 5 => 1, 6 => 0.7];
我目前正在使用Mysql

编辑1:

我试图得到的是每列(a-e)的加权平均值(不是行)。单元格值由权重指数定义

与平均值(a)类似,但权重为1的行的值为0.5


使用权重值创建另一个表。加入它,用平均数乘以重量

CREATE TABLE weights (
    id int PRIMARY KEY NOT NULL,
    weight FLOAT
);
INSERT INTO weights (id, weight) VALUES
(1, 0.5), (2, 1), (3, 1), (4, 1), (5, 1), (6, 0.7);

SELECT t.store_id, 
    SUM(w.weight * t.a)/SUM(w.weight) AS a, 
    SUM(w.weight * t.b)/SUM(w.weight) AS b, 
    SUM(w.weight * t.c)/SUM(w.weight) AS c, 
    SUM(w.weight * t.d)/SUM(w.weight) AS d, 
    SUM(w.weight * t.e)/SUM(w.weight) AS e
FROM your_table AS t
JOIN weights AS w ON t.weight_index = w.id
GROUP BY t.store_id;

感谢Barmar,但是这将产生每行的加权平均值。我需要每列的平均值。我想可能是这样,但我不确定。我已将其更新为“按存储ID平均”。这确实会产生每列的平均值,但不会产生加权平均值,因为它只会乘以值,使权重索引1行的值更小,从而对总平均值的影响更大。权重为1的行与权重为0.5的两行的值相同。有一个很好的在线计算器。
CREATE TABLE weights (
    id int PRIMARY KEY NOT NULL,
    weight FLOAT
);
INSERT INTO weights (id, weight) VALUES
(1, 0.5), (2, 1), (3, 1), (4, 1), (5, 1), (6, 0.7);

SELECT t.store_id, 
    SUM(w.weight * t.a)/SUM(w.weight) AS a, 
    SUM(w.weight * t.b)/SUM(w.weight) AS b, 
    SUM(w.weight * t.c)/SUM(w.weight) AS c, 
    SUM(w.weight * t.d)/SUM(w.weight) AS d, 
    SUM(w.weight * t.e)/SUM(w.weight) AS e
FROM your_table AS t
JOIN weights AS w ON t.weight_index = w.id
GROUP BY t.store_id;