Mysql 如何在SQL中获得每个组的平均值并找出异常值
以下是我的数据:Mysql 如何在SQL中获得每个组的平均值并找出异常值,mysql,sql,statistics,aggregate,Mysql,Sql,Statistics,Aggregate,以下是我的数据: id | value | group ------------------ 1 | 4 | abc 2 | 8 | def 3 | 100 | abc 4 | 8 | ghi 5 | 7 | abc 6 | 10 | ghi 我需要计算出排除异常值(例如,对于组=abc,id=3)的每个组的平均值。然后在平均值旁边显示欧利。对于上述数据,我期望结果如下: group = 'abc' average = '5.5' out
id | value | group
------------------
1 | 4 | abc
2 | 8 | def
3 | 100 | abc
4 | 8 | ghi
5 | 7 | abc
6 | 10 | ghi
我需要计算出排除异常值(例如,对于组=abc,id=3)的每个组的平均值。然后在平均值旁边显示欧利。对于上述数据,我期望结果如下:
group = 'abc'
average = '5.5'
outlier = '100'
可以通过子查询排除不需要的值
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`
一种方法是创建一个子查询,其中包含每个组的统计数据(平均值和标准偏差),然后将其连接回原始表,以确定哪些记录是异常值,哪些组是异常值
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
更新:
出于某种原因,您的值
列似乎是实际的varchar
而不是数字类型。这意味着你将无法对它进行任何数学运算。首先,通过以下方式将该列转换为整数:
ALTER TABLE yourTable MODIFY value INTEGER;
如果只需要大于平均值的异常值,则使用以下WHERE
子句:
WHERE t1.value - t2.valAvg > t2.valStd
根据您的定义,什么是离群值?您是如何定义离群值的,例如,与平均值的标准偏差超过一个的值?是,离群值是指与平均值相差>一个标准偏差的任何值。可能有多个离群值,我需要在输出中列出每个离群值。当我运行查询时,我遇到以下错误:将数据类型varchar转换为数值时出错。将
值
列转换为数值类型。如果我展开表的“列”文件夹,它将显示值列为“(数值(18,2),null)”,则不应出现此错误。如果没有亲自查看您的设置,我恐怕无法在此提供更多的见解。我在代码中有一个错误,在更正它之后,它似乎正在工作!有没有办法只列出高于或高于平均值而不低于平均值的异常值?此外,如何显示与这些异常值关联的ID-谢谢