2016-08-15 132 views
2

這是我的數據是什麼樣子:如何獲得每組平均,並找出異常值在SQL

id | value | group 
------------------ 
1 | 4  | abc 
2 | 8  | def 
3 | 100 | abc 
4 | 8  | ghi 
5 | 7  | abc 
6 | 10 | ghi 

我需要爲每個組計算出的平均值,其中的異常值(用於如ID = 3組= abc)被排除在外。然後顯示平均值旁邊的ouliers。對於上述數據,我希望這樣的事情的結果:

group = 'abc' 
average = '5.5' 
outlier = '100' 
+1

根據什麼給你定義了一個異常? –

+0

你如何定義異常值一個值超過平均值的一個標準偏差? –

+0

是的,異常值大於平均值的一個標準偏差。 – user5495762

回答

2

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

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 
+0

當我運行您的查詢時,我收到此錯誤:將數據類型varchar轉換爲數字時出錯。 – user5495762

+0

將'value'列轉換爲數字類型。 –

+0

如果我展開我的表的列文件夾,它將values列顯示爲'(numeric(18,2),null)' – user5495762

0

您可以排除不使用子查詢

select `group`, avg/value) from my_table 
where (group, value) not in (select `group`, max(value) 
           from my_table 
           group by `group`) 
from my_table 
group by `group`