MYSQL按其他列加权平均
我试图得到mysql表中5列的加权平均值。通过获取所有行并在php中计算,我成功地做到了这一点 然而,由于我的表现在有超过2.000.000行,并且查询很少有20.000行,所以它运行缓慢 基本上,如果行的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 |
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;