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