一种方法创建一个包含每个组的统计子查询所需要的价值(平均值和标准偏差),然后将其加回到原始表格中,以确定哪些记录是异常值,为哪个组。
SELECT t1.id,
t1.group AS `group`,
t2.valAvg AS average,
t1.value AS outlier
FROM yourTable t1
INNER JOIN
(
SELECT `group`, AVG(value) AS valAvg, STDDEV(value) AS valStd
FROM yourTable
GROUP BY `group`
) t2
ON t1.group = t2.group
WHERE ABS(t1.value - t2.valAvg) > t2.valStd -- any record whose value is MORE
-- than one standard deviation from
-- the mean is an outlier
更新:
看来,出于某种原因,你的value
列是实际varchar
而不是数字类型。这意味着你将无法对其进行任何数学运算。所以第一,列转换为整数通过:
ALTER TABLE yourTable MODIFY value INTEGER;
如果你只是想离群这是更大比普通然后使用以下WHERE
条款:
WHERE t1.value - t2.valAvg > t2.valStd
根据什么给你定义了一个异常? –
你如何定义异常值一个值超过平均值的一个标准偏差? –
是的,异常值大于平均值的一个标准偏差。 – user5495762