一種方法創建一個包含每個組的統計子查詢所需要的價值(平均值和標準偏差),然後將其加回到原始表格中,以確定哪些記錄是異常值,爲哪個組。
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