Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 值与平均值之间的差异(值)_Mysql_Sql - Fatal编程技术网

Mysql 值与平均值之间的差异(值)

Mysql 值与平均值之间的差异(值),mysql,sql,Mysql,Sql,我想知道是否有可能提出如下一个问题 我有一个包含id和值的表。 示例: table EXAMPLE |id | value | | 1 | 65| | 2 | 13| | 3 | 22| 我要做的是进行如下查询,返回集合: |id | value | average | difference| | 2 | 13|

我想知道是否有可能提出如下一个问题

我有一个包含id和值的表。 示例:

 table EXAMPLE
|id        |  value     |
|        1 |          65|
|        2 |          13|
|        3 |          22|
我要做的是进行如下查询,返回集合:

|id        |  value     | average | difference|   
|        2 |          13|     33.3|       20.3|
|        3 |          22|     33.3|       11.3|
问题是如何处理不同的栏目

还有一个问题: 如何在集合中只包含小于或大于平均值的值

SELECT id,
       value,
       (SELECT AVG(value) FROM EXAMPLE ) as average
having 
       value <  average.
我使用have代替where的原因是where在select之前执行,因此我不能在其中使用average,average是在查询执行的select阶段计算的

我还怀疑我不仅计算了一次AVGvalue,而且还计算了表中每一行的AVGvalue。 我说得对吗?如果我是,那就太糟糕了,这肯定不是我想要的

请让我了解一下MySQL子查询的执行顺序,或者分享一些关于这个主题的链接。
先谢谢你

您必须单独计算总体平均值并强制交叉连接:


我想这就行了。您需要分组才能聚合函数

SELECT id, value, (SELECT AVG(value) FROM example GROUP BY id) AS average,
       average - value AS diff
FROM example
GROUP BY id
HAVING value < average;

这也起到了作用

select id, value,
       (select avg(Value) from table1) as avg,
       (select avg(Value) from table1) - value as Diff
from table1 having Diff > 0

非常抱歉。这是问题的第一个版本。编辑。尽管如此,我认为这在这个问题上并不重要。我希望我能被理解。非常感谢!我花了数小时寻找如何实现这一点。如果你按id分组,你会得到每个id的平均值。这不是我想要的。此外,由于所有非聚合列都应位于group by中,因此group by通常是非法的。也就是说,OP也有一个无效的查询,甚至缺少基本FROM子句……在这种情况下,avg只计算一次或每次选择新行时计算一次?好问题,我认为这取决于优化器。它应该能够认识到所有行的平均选择是恒定的,因此只需计算一次,但我不敢预测对于特定的dbms是否如此:
select id, value, (select avg(value) from EXAMPLE ) as average, 
   (select avg(value) from EXAMPLE ) - value as difference
   from EXAMPLE ;
select id, value,
       (select avg(Value) from table1) as avg,
       (select avg(Value) from table1) - value as Diff
from table1 having Diff > 0