MySQL中的累积平均值
我有一个带有id和值的表,如下所示。是否有可能得到另一列,该列的值除以该行的累积平均值MySQL中的累积平均值,mysql,Mysql,我有一个带有id和值的表,如下所示。是否有可能得到另一列,该列的值除以该行的累积平均值 original table : t1 +----+----------------------+ | id | Val | +----+---------------------+- | 1 | NULL | | 2 | 136 |
original table : t1
+----+----------------------+
| id | Val |
+----+---------------------+-
| 1 | NULL |
| 2 | 136 |
| 3 | 42 |
table i want to get
+----+---------------------+-----------------------------+
| id | Val | VAL/(AVG(VAL) ) |
+----+---------------------+-----------------------------+
| 1 | NULL | NULL |
| 2 | 136 | 136/((136+0)/2)=2.000 |
| 3 | 42 | 42/((42+136+0)/3)=0.708 |
我的问题是:
SELECT t1.id, t1.Val, Val/AVG(t1.Val)
FROM followers t1
JOIN followers t2
ON t2.id <= t1.id
group by t1.id;
似乎AVG(Val)从col Val返回相同的值
我希望在这里做一些类似于这个链接的事情,但是我想要的不是平均值。
我重新实现了编辑,并考虑了带有NULL的行:
+----+---------------------+---------------------+
| id | Val | VAL/(AVG(VAL) ) |
+----+---------------------+----------------------+
| 1 | NULL | NULL |
| 2 | 136 | 1.0000 |<---need this to = 2.000
| 3 | 42 | 0.4719 |<---need this to = 0.708
SELECT t1.id, t1.Val, t1.Val/(SUM(t2.Val)/(t1.id)) AS C
FROM followers t1
JOIN followers t2
ON t2.id <= t1.id
group by t1.id;
+----+---------------------+---------------------+
|id | Val | Val/(平均值(Val))|
+----+---------------------+----------------------+
|1 |零|零|
|2 | 136 | 1.0000 |我想你想要t2.val
在avg()
中:
对于val
的空值,这可能会出现错误,但它提供了一种在MySQL中进行计算的更快方法。您需要的是一个运行总数。然后是简单的数学。这是使用变量实现的。这里有一个例子:或者您可以尝试t1.val/AVG(t2.val)为什么不在应用层中计算呢?在DB层中执行此操作实际上是要求DB执行其未优化的逻辑。@MikeBrant您确定吗?我觉得还可以@正如下面Gordon Linoff的回答中所建议的那样,以相当于部分笛卡尔连接的方式将一个表连接到它自己。或者使用MySQL变量执行其他一些基于过程的方法可能没有在应用程序中查询单个行并计算运行总数那么有效。虽然这应该可以工作,但在较大的DB表上速度会非常慢。实际上,您将创建n*((n-1)/2)行。如果您的DB是10行,那么就可以了,这将在join之后产生45行。但是,如果您的DB是1M行,那么产生的联接将是近5000亿行。@草莓。“谢谢你。”戈登林诺夫:原来的查询成功了。对于我想要的行,带变量的返回NULL。
+----+---------------------+---------------------+
| id | Val | VAL/(AVG(VAL) ) |
+----+---------------------+----------------------+
| 1 | NULL | NULL |
| 2 | 136 | 1.0000 |<---need this to = 2.000
| 3 | 42 | 0.4719 |<---need this to = 0.708
SELECT t1.id, t1.Val, t1.Val/(SUM(t2.Val)/(t1.id)) AS C
FROM followers t1
JOIN followers t2
ON t2.id <= t1.id
group by t1.id;
SELECT t1.id, t1.Val, t1.Val/AVG(t2.Val)
FROM followers t1 JOIN
followers t2
ON t2.id <= t1.id
group by t1.id;
select t.id, t.val,
(case when (@n := @n + 1) is null then null
when (@cumval := @cumval + val) is null then null
else t.val / (@cumval / @n)
end)
from followers t cross join
(select @n := 0, @cumval := 0) vars
order by t.id;