假设我将10定义为两个值之间的足够接近的差,我想要的是彼此足够接近的所有值的平均值(或换句话说,按它们的接近度分组)。因此,如果我有一个具有以下值的表:
+-------+
| value |
+-------+
| 1 |
| 1 |
| 2 |
| 4 |
| 2 |
| 1 |
| 4 |
| 3 |
| 22 |
| 23 |
| 24 |
| 22 |
| 20 |
| 19 |
| 89 |
| 88 |
| 86 |
+-------+
我想要一个查询,将输出以下结果:
+---------+
| 2.2500 |
| 21.6667 |
| 87.6667 |
+---------+
其中2.2500将作为从1到4的所有值的平均值生成,因为它们之间相距10或更少。同样,21.6667将是从19到24的所有值的平均值,而87.6667将是从86到89的所有值的平均值。
我指定的当前差值为10时,必须是可变的。
最佳答案
这还不错。您想在MySQL中实现lag()
函数,以确定某个值是否是一组新的行的开始。然后,您需要该值的累积总和来标识一个组。
代码看起来很痛苦,因为在MySQL中,您需要使用相关的子查询和联接/聚合来执行此操作,而不是使用ANSI标准函数,但这看起来是这样的:
select min(value) as value_min, max(value) as value_max, avg(value) as value_avg
from (select t.value, count(*) as GroupId
from table t join
(select value
from (select value,
(select max(value)
from table t2
where t2.value < t.value
) as prevValue
from table t
) t
where value - prevvalue < 10
) GroupStarts
on t.value >= GroupStarts.value
group by t.value
) t
group by GroupId;
子查询
GroupStarts
正在查找断点,即与上一个值相差10个或更多的值的集合。下一级别使用联接/聚合来计算任何给定值之前的此类断点数。然后,最外面的查询使用此GroupId
进行聚合。关于mysql - 如果表中的值很接近,如何将它们分组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20734888/