根据sql中的sigma和标准差选择异常值

时间:2014-10-14 03:55:51

标签: sql outliers

样本数据是这样的。

enter image description here

我想为每个班级选择4 sigma中的异常值。 我试过了

  select  value,class,AVG(value) as mean, STDEV(value)as st, size  from Data
 having value<mean-2*st OR value>mean+2*st group by calss
似乎不起作用。我应该在这里使用having或where子句吗?

我想要的结果是整个第3行和第8行。

1 个答案:

答案 0 :(得分:1)

如果您正在查看的条件是该行的属性,请使用wherewhere class = 1(所有第1类行)或where size > 2(所有行的大小均为&gt; 2) )。如果条件是一组行的属性,则使用group by ... having,例如group by class having avg(value) > 2(所有,平均值> 2)。

在这种情况下,你想要where但是有一个复杂的问题。单独在每一行中都没有足够的信息来编写必要的where子句,因此您必须通过子查询来获取它。

最终你想要SELECT value, class, size FROM Data WHERE value < mean - 2 *st OR value > mean + 2*st;这样的东西,但是你需要一个子查询来获得meanst

一种方法是:

SELECT value, Data.class, size, mean, st FROM Data, 
INNER JOIN (
  SELECT class, AVG(value) AS mean, STDEV(value) AS st 
  FROM Data GROUP BY class
) AS stats ON stats.class = Data.class
WHERE value < mean - 2 * st OR value > mean + 2 * st;

这会创建一个子查询,它可以获取每个类的均值和标准偏差,将这些数字连接到具有匹配类的行,然后应用异常值检查。