样本数据是这样的。
我想为每个班级选择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行。
答案 0 :(得分:1)
如果您正在查看的条件是该行的属性,请使用where
即where 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;
这样的东西,但是你需要一个子查询来获得mean
和st
。
一种方法是:
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;
这会创建一个子查询,它可以获取每个类的均值和标准偏差,将这些数字连接到具有匹配类的行,然后应用异常值检查。