Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SQL中获得每个组的平均值并找出异常值_Mysql_Sql_Statistics_Aggregate - Fatal编程技术网

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-谢谢