Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中创建正在运行的差异列_Mysql - Fatal编程技术网

在MySQL中创建正在运行的差异列

在MySQL中创建正在运行的差异列,mysql,Mysql,我希望在MySQL表中创建一列,计算另一列的最后五个值的运行方差(或标准偏差,以最简单的为准)。我目前使用三个变量对数据进行排序:ID、date和计数器(每个ID-date配对的计数器从1递增)。因此,每次新的ID日期组合开始时,我希望这个新的方差列也重置。以下是我想要的一个小样本: +----+--------+---------+-------+--------------------------+ | ID | date | counter | value | var(v

我希望在MySQL表中创建一列,计算另一列的最后五个值的运行方差(或标准偏差,以最简单的为准)。我目前使用三个变量对数据进行排序:ID、date和计数器(每个ID-date配对的计数器从1递增)。因此,每次新的ID日期组合开始时,我希望这个新的方差列也重置。以下是我想要的一个小样本:

+----+--------+---------+-------+--------------------------+ | ID | date | counter | value | var(value) | +----+--------+---------+-------+--------------------------+ | 11 | 1/1/13 | 1 | 2.1 | var(2.1) | | 11 | 1/1/13 | 2 | 2.4 | var(2.1,2.4) | | 11 | 1/1/13 | 3 | 2.3 | var(2.1,2.4,2.3) | | 11 | 1/1/13 | 4 | 2.5 | var(2.1,2.4,2.3,2.5) | | 11 | 1/1/13 | 5 | 2.3 | var(2.1,2.4,2.3,2.5,2.3) | | 11 | 1/1/13 | 6 | 2.5 | var(2.4,2.3,2.5,2.3,2.5) | | 11 | 1/3/13 | 1 | 5.4 | var(5.4) | | 11 | 1/3/13 | 2 | 4.3 | var(5.4,4.3) | | 11 | 1/3/13 | 3 | 3.4 | var(5.4,4.3,3.4) | | 11 | 1/3/13 | 4 | 2.1 | var(5.4,4.3,3.4,2.1) | +----+--------+---------+-------+--------------------------+ +----+--------+---------+-------+--------------------------+ |ID |日期|计数器|值| var(值)| +----+--------+---------+-------+--------------------------+ |11 | 1/1/13 | 1 | 2.1 | var(2.1)| |11 | 1/1/13 | 2 | 2.4 | var(2.1,2.4)| |11 | 1/1/13 | 3 | 2.3 | var(2.1,2.4,2.3)| |11 | 1/1/13 | 4 | 2.5 | var(2.1,2.4,2.3,2.5)| |11 | 1/1/13 | 5 | 2.3 | var(2.1,2.4,2.3,2.5,2.3)| |11 | 1/1/13 | 6 | 2.5 | var(2.4,2.3,2.5,2.3,2.5)| |11 | 1/3/13 | 1 | 5.4 | var(5.4)| |11 | 1/3/13 | 2 | 4.3 | var(5.4,4.3)| |11 | 1/3/13 | 3 | 3.4 | var(5.4,4.3,3.4)| |11 | 1/3/13 | 4 | 2.1 | var(5.4,4.3,3.4,2.1)| +----+--------+---------+-------+--------------------------+ 有人知道如何在MySQL中实现这一点吗?我还没有找到任何类似于这个问题的解决方案


非常感谢

方差是每个值与平均值之间差值平方和的平均值。所以,你可以通过大量的连接和算术来实现这一点。大概是这样的:

select t.*,
       (case when t1.date is null then 0
             when t2.date is null
             then (pow(t.value - (t.value + t1.value) / 2, 2) +
                  pow(t1.value - (t.value + t1.value) / 2, 2))/2
             when t3.date is null
             then (pow(t.value - (t.value + t1.value + t2.value) / 3, 2) +
                   pow(t1.value - (t.value + t1.value + t2.value) / 3, 2) + 
                   pow(t2.value - (t.value + t1.value + t2.value) / 3, 2)
                  ) / 3
             when t4.date is null
             then (pow(t.value - (t.value + t1.value + t2.value + t3.value) / 4, 2) +
                   pow(t1.value - (t.value + t1.value + t2.value + t3.value) / 4, 2) + 
                   pow(t2.value - (t.value + t1.value + t2.value + t3.value) / 4, 2) +
                   pow(t3.value - (t.value + t1.value + t2.value + t3.value) / 4, 2)
                  ) / 4
             else (pow(t.value - (t.value + t1.value + t2.value + t3.value + t4.value) / 5, 2) +
                   pow(t1.value - (t.value + t1.value + t2.value + t3.value + t4.value) / 5, 2) + 
                   pow(t2.value - (t.value + t1.value + t2.value + t3.value + t4.value) / 5, 2) +
                   pow(t3.value - (t.value + t1.value + t2.value + t3.value + t4.value) / 5, 2) +
                   pow(t4.value - (t.value + t1.value + t2.value + t3.value + t4.value) / 5, 2)
                  ) / 5
        end) as var
from t left outer join
     t t1
     on t.date = t1.date and t.counter = t1.counter + 1 left outer join
     t t2
     on t.date = t2.date and t.counter = t2.counter + 2 left outer join
     t t3
     on t.date = t3.date and t.counter = t3.counter + 3 left outer join
     t t4
     on t.date = t4.date and t.counter = t4.counter + 4;
您可以使用适当的聚合函数对自联接进行分组,例如:

选择一个*方差(b值)
从我的桌子a
在b.ID=a.ID上加入我的_表b
b.date=a.date

这是可以做到的,但需要做一点工作。让我们先看看你的一些努力——展示一种尝试。这不是一个编码服务。或者我们只是给你一个答案。真正地我错过什么了吗/+很好。以前从未遇到过此agg函数
SELECT   a.*, VARIANCE(b.value)
FROM     my_table a
    JOIN my_table b ON b.ID       = a.ID
                   AND b.date     = a.date
                   AND b.counter <= a.counter
GROUP BY a.ID, a.date, a.counter, a.value