如何从MySQL表中删除大数据尖峰

时间:2012-07-27 07:19:38

标签: mysql

我有一个数据库被输入图表。由于某种原因,我的PHP脚本会在我的数据库中插入非常大的峰值...

例如:Screenshot http://img38.imageshack.us/img38/4714/b01927e05d0946fd83708b0.png

正如您所看到的,图表中存在随机峰值,其中数据有时会从300上升到3000,然后再次直接下降到300.

我需要的是一种整理这些表并删除大于上一行和下一行的数据的方法。

我做了一些谷歌研究,但无法想出任何东西!

提前致谢。

3 个答案:

答案 0 :(得分:4)

您可以采取一些措施来删除这些“离群值”数据点:

您可以删除与平均值相差超过标准偏差N倍的点数。例如,如果数据是正态分布的,那么这将大致消除前2.5%:

delete from datapoints where value > (select avg(value)+2*stddev(value) 
                                      from datapoints);

或者,您可以直接删除前1%的数据,留下数据的第99个百分位数。有效地找到百分点是一个更难的问题,但这样的事情可能有用:

set @rownum = 0;
@percentile = select value from (select value, @rownum:=@rownum+1 as rownum from datapoints) D
              where rownum > (select 0.99*count(value) from datapoints) limit 1;
delete from datapoints where value > @percentile;

这些方法删除一般异常大的所有数据点,而不考虑数据中的一般趋势或周期。这意味着山谷中的尖峰可能未被发现。需要更高级的算法来处理这些情况。例如,您可以修改第一种方法,根据特定环境中的数据点删除异常值:

delete from datapoints d2 where value > 
    (select avg(value)+2*stddev(value) 
     from datapoints d1 
     where d1.dt between d2.dt - interval 2 hour 
                     and d2.dt + interval 2 hour);

答案 1 :(得分:0)

如果你要做的就是删除值超过某个阈值的所有行(这里我使用了300),那么你可以使用:

DELETE FROM table WHERE value > 300;

为防止插入它们,您可以在插入时测试值,并仅为低于阈值的行插入行。

if ($data['value'] < 300) {
    // insert
}

答案 2 :(得分:0)

谢谢所有试图提供帮助的人。排序问题。这是因为我以30分钟的间隔获取数据,有时在30分钟的时间间隔内数据确实上升到那么高,但是在接下来的30分钟内它已经再次下降。我采用了平均算法。在我的图表现在所以一切都很好:))

乔什