SQL:如何找到相关项目的集群?
我们有以下形式的模式:SQL:如何找到相关项目的集群?,sql,Sql,我们有以下形式的模式: CREATE TABLE p ( id int(11) NOT NULL, PRIMARY KEY (id) ); INSERT INTO p (id) VALUES (1), (2), (3), (4), (5), (6); CREATE TABLE IF NOT EXISTS pi ( product_id int(11) NOT NULL, value varchar(10) NOT NULL, PRIMARY KEY (product_id
CREATE TABLE p (
id int(11) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO p (id) VALUES (1), (2), (3), (4), (5), (6);
CREATE TABLE IF NOT EXISTS pi (
product_id int(11) NOT NULL,
value varchar(10) NOT NULL,
PRIMARY KEY (product_id, value)
);
INSERT INTO pi (product_id, value) VALUES
(1, 'a'),
(1, 'b'),
(2, 'a'),
(3, 'b'),
(4, 'c'),
(5, 'd'),
(5, 'e'),
(6, 'd');
(6, 'e');
一个产品可以有多个标识符
我们希望创建共享相同标识符的产品集群。例如:
Product 1
ID a
ID b
Product 2
ID a
Product 3
ID b
虽然产品2和3看起来不相关,但通过检查产品1,我们发现所有三种产品都属于彼此,因为它们属于同一个标识符组
结果应该是断开连接的产品集群,其中每个产品只属于一个组。对于上面的示例数据,我希望获得以下产品集群:
1, 2, 3
4
5, 6
在纯SQL中有什么方法可以实现这一点吗
我们还没有决定使用哪种引擎,所以任何开源SQL数据库方言都是可以接受的。这主要是为了好玩,而且只有一个级别。它适用于提供的示例数据,可能不是您的真实数据。性能可能也不好。假设是PostgreSQL
select
array_agg(gp.product_id)
from (
select
productat_id,
array_agg(value)
from pi
group by product_id
) as gp
left join (
select
product_id,
array_agg(value)
from pi
group by product_id
having count(*)>1
) gp2
on gp.array_agg && gp2.array_agg
and gp.product_id <> gp2.product_id
group by coalesce(gp2.array_agg, gp.array_agg);
array_agg
-----------
{1,3,2}
{5,6}
{4}
(3 rows)
你能再给我一些样本数据吗?目前我很难理解您想要的是什么听起来好像递归查询可以实现您想要的您可能可以通过编写一些复杂的存储过程来实现,但是代码将很难编写和维护,而如果您决定编写一些代码来实现这一点,您将能够重用大量现有组件并尝试不同的集群算法。一些机器学习框架确实具有数据库连接,比如Weka。我的2cI添加了一些真实的SQL示例数据来澄清。存储过程是可以接受的,因为我们要查看数百万条记录。我会在这段时间看一看Weka。。。