假设我将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/

10-15 10:29