Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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,我有一个数据库,它被输入到一个图表中。出于某种原因,我的PHP脚本不时会在我的数据库中插入非常大的峰值 例如: 正如您所看到的,在图中有随机尖峰,数据有时从300上升到3000,然后又直接下降到300 我需要的是一种方法来整理这些表,并删除比上一行和下一行大得多的数据 我做了一点谷歌的研究,但什么也做不出来 提前感谢。如果您只想删除值高于某个阈值的所有行(这里我使用了300),那么您可以使用: DELETE FROM table WHERE value > 300; 为了防止它们被插入,

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

例如:

正如您所看到的,在图中有随机尖峰,数据有时从300上升到3000,然后又直接下降到300

我需要的是一种方法来整理这些表,并删除比上一行和下一行大得多的数据

我做了一点谷歌的研究,但什么也做不出来


提前感谢。

如果您只想删除值高于某个阈值的所有行(这里我使用了300),那么您可以使用:

DELETE FROM table WHERE value > 300;
为了防止它们被插入,您可以在插入时测试您的值,并且只为低于阈值的值插入行

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

如果您只想删除值高于某个阈值的所有行(这里我使用了300),那么您可以使用:

DELETE FROM table WHERE value > 300;
为了防止它们被插入,您可以在插入时测试您的值,并且只为低于阈值的值插入行

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

要删除这些“异常值”数据点,您可以做以下几件事:

您可以删除与平均值相差超过标准偏差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);

要删除这些“异常值”数据点,您可以做以下几件事:

您可以删除与平均值相差超过标准偏差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);

你能把php脚本的代码放进去吗?也许解决办法不是删除数据。。。它看到为什么添加了错误的数据我怀疑它是PHP,原因是数据是从外部程序发送到PHP进行日志记录的。我很确定这就是问题所在。擦掉它!我想我发现了我的问题。。。我使用的查询以20分钟的间隔检索行,这意味着如果有持续20分钟的峰值,它只会显示为单个用户峰值。。。SQL中必须有某种可用的平均值!然后,您必须存储检索数据的时间,而不是在检索数据时:p检索数据的时间也存储在数据库中:p您可以输入php脚本的代码吗?,也许解决方案不是删除数据。。。它看到为什么添加了错误的数据我怀疑它是PHP,原因是数据是从外部程序发送到PHP进行日志记录的。我很确定这就是问题所在。擦掉它!我想我发现了我的问题。。。我使用的查询以20分钟的间隔检索行,这意味着如果有持续20分钟的峰值,它只会显示为单个用户峰值。。。SQL中必须有某种可用的平均值!然后您必须存储检索到的数据的时间,而不是在检索数据时:p检索到的数据的时间也存储在数据库中:PYea,以表为基础确定。。。但有些表的数据值在200->3000之间,这是真实数据。没有不一致的数据。是的,以表格为基础确定。。。但有些表的数据值在200->3000之间,这是真实数据。不是故障数据。