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年。