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