2016-08-15 3 views
2

Это то, что выглядит мои данные, как:Как получить среднее для каждой группы и выяснить, выпадающих в SQL

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

Мне нужно, чтобы выяснить средние по группе, где выбросы (например, для ид = 3 для группы = abc) исключены. Затем отобразите плющилки рядом со средними значениями. Для приведенных выше данных я ожидал что-то вроде этого, как результат:

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

, что в соответствии с вами определяет выброс ? –

+0

Как вы определяете outlier, например. значение, превышающее стандартное отклонение от среднего? –

+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 

Update:

Оказывается, что, по какой-то причине ваша value колонка актуальна varchar, а не числового типа. Это означает, что вы не сможете использовать математику. Таким образом, во-первых, преобразовать этот столбец в целое число с помощью:

ALTER TABLE yourTable MODIFY value INTEGER; 

Если вы хотите только выбросы, которые больше, чем в среднем, используйте следующий WHERE пункт:

WHERE t1.value - t2.valAvg > t2.valStd 
+0

Когда я запускаю ваш запрос, я получаю эту ошибку: Ошибка преобразования типа данных varchar в числовой. – user5495762

+0

Преобразуйте столбец 'value' в числовой тип. –

+0

Если я разворачиваю папку столбцов для своей таблицы, она показывает столбец значений как '(числовое значение (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` 
Смежные вопросы