Mysql sql中按范围划分的群集数

Mysql sql中按范围划分的群集数,mysql,sql,Mysql,Sql,我的数据如下所示: Mike 5 Mike 100 Mike 101 Mike 106 Mike 95 Mike 1000 Mike 1001 Mike 1010 Jen 2006 Jen 2001 Jen 2010 Jen 3000 Jen 10 我想按绝对值20对数字进行聚类,并在每个聚类中保留最小的一个 结果如下所示: Mike 5 Mike 95 Mike 1000 Jen 2006 Jen 3000

我的数据如下所示:

Mike   5
Mike   100
Mike   101
Mike   106
Mike   95
Mike   1000
Mike   1001
Mike   1010
Jen    2006
Jen    2001
Jen    2010
Jen    3000
Jen    10

我想按绝对值20对数字进行聚类,并在每个聚类中保留最小的一个

结果如下所示:

Mike   5
Mike   95
Mike   1000
Jen    2006
Jen    3000
Jen    10
有没有办法做到这一点? 我曾经考虑过分组休息, 但是,如果集群穿过间隔,则没有意义, 例如,如果我将范围设置为 1-20, 21-40, 41-60 但如果我的数据有:

Mike   35
Mike   39
Mike   41
Mike   45
它将被分成两个集群

Mike   35
Mike   41
我想要的是:

Mike   35

谢谢

如果我理解正确,您希望每个名称的最小值来启动集群。该集群依次包含值为20的相同名称的所有行。然后对其余簇重复此操作

这表明了一种递归CTE:

with recursive tn as (
      select t.*, row_number() over (partition by name order by val) as seqnum
      from t
     ),
     cte as (
      select name, val, seqnum, val as cluster_val, 1 as cluster_num
      from tn
      where seqnum = 1
      union all
      select cte.name, tn.val, tn.seqnum,
             (case when tn.val < cte.cluster_val + 20 then cte.cluster_val else tn.val end) as cluster_val,
             (case when tn.val < cte.cluster_val + 20 then cte.cluster_num + 1 else 1 end) as cluster_num
      from cte join
           tn
           on tn.name = cte.name and tn.seqnum = cte.seqnum + 1
     )
select *
from cte
where cluster_num = 1
order by name, val;

是一个数据集。

您必须制定一个精确而明确的标准来划分簇。因此,任何接受标准描述和数据集的人都会得到相同的结果。现在你的标准太接近了。。。例如,在正确状态下,数据数组10,25,40可以分为10,25+40和10+25,40。我想用绝对值20对数字进行聚类。这对我来说毫无意义。更多的解释会有帮助。@mike。如果我理解正确,那么2001年应该是Jen的集群,而不是2006年。