我在表中有数据,我想故意忽略一些明显不正确的数据,并取平均一些更合理的数据。
这是我的意思的简化示例。假设我有一张表格,以厘米为单位列出人员及其身高。
我可能会用它来获取平均身高.....
SELECT AVG(height) FROM people;
如果全部正确地添加了数据就很好了,但是如果(例如)数据库中有十个人的身高正确,并且一个人的身高被记录为十亿厘米高,那么AVG()将会成功。返回有意义的值-GIGO(垃圾进,垃圾出)的经典示例
有什么方法可以调整上述SQL函数以忽略边远的数据点? -如此的数据与其余所有数据都不一样吗?
我非常确定该解决方案将涉及here中列出的功能之一,但是我很难找到一些有关它们的功能和工作原理的简单英语解释。
更新....... 为了简化说明,选择了我引用的使用高度的示例。任何建议的解决方案都不能简单地在合理的值之间进行过滤(即,高度高于1.5m且低于2m),因为对于我使用的实际数据,我不知道合理的值是什么!该解决方案需要拒绝与大多数其他数据有很大差异的数据-因此,我想这是掌握统计信息的地方。
更新2)对不起,我以前接受的答案将不被接受(尽管有帮助!)。标准差为数据的“传播”提供了一个值,但对外围数据的位置(即笨拙的矮个子或笨拙的矮个子的人)一无所知,所以有一个像这样的子句... >
WHERE height BETWEEN (SELECT a-2*sd FROM cte) AND (SELECT a+2*sd FROM cte);
不仅要从范围的另一端移走一个愚蠢的高个子,还要从范围的另一端移走所有“正常身高”的人! 我可以这样调整WHERE子句。...
WHERE height BETWEEN (SELECT a-(sd/100) FROM cte) AND (SELECT a+(sd/100) FROM cte);
但是我正在寻找一种不需要对每个不同的数据进行单独调整的解决方案
答案 0 :(得分:3)
您可以使用$cmd1 = "$ffmpeg -i $file_full_path -ss 00:00:02 -t 00:00:02 -r 20 -vf scale=200:113,drawtext=text='hello' output.gif";
:
FILTER
SELECT AVG(height) FILTER (WHERE height BETWEEN x AND y) AS avg_height
FROM people;
-- or `WHERE`:
SELECT AVG(height) AS avg_height
FROM people
WHERE height BETWEEN x AND y;
和x
是合理的值。
或者,您可以过滤掉average() +/- 2*stddev()
范围之外的值
y