这里是一个解决方案,基于sql server cte语法:
我有一个与社交网络有点相似的问题。我需要确定一个朋友网络中的所有候选人,并为该朋友网络提供一个网络名称或号码。我将不得不用SQL或R
来写这个“ Createdcolumn(network)”)是我最后需要创建的内容。 Column1和Column2已经在我的数据中
S.no/lineno Column1 Column2 Createdcolumn(network)
1 Peet Jackson 1
2 Jason Filip 2
3 Luke Filip 2
4 Jason Becky 2
5 Aron Chris 3
6 Maron Cheese 4
7 Matt Brooklyn 5
8 Brooklyn Federer 5
9 Ruselle Federer 5
关于了解第一个图的更多信息,了解创建的列:
第2、3、4行在网络2中在一起,因为那是一个朋友圈,这是逻辑:
第2行和第3行由于Filip而被连接
由于杰森,第4和2行已连接
(因此,现在所有第2、3和4行实际上都是一个网络,因为它们都以某种方式连接;也许是朋友的朋友,或者朋友的朋友,或者n是朋友的朋友)
同样,7,8,9是一个网络,这是逻辑:
第7行和第8行是布鲁克林的一个网络,>]
第8和9行由于费德勒而成为一个网络
(因此,现在所有第7、8和9行实际上都是一个网络,因为它们以某种方式连接;可能是朋友的朋友,或者朋友的朋友,或者n是朋友的朋友)
] >第1行:Peet和Jackson没有其他朋友网络,所以该行本身就是一个网络
第5行:Aron和Chris没有其他朋友网络,因此该行本身就是一个网络
现在
S.no/lineno Column1 Column2 Createdcolumn(network) 1 Peet Jackson 1 2 Jason Filip 2 3 Luke Filip 2 4 Jason Becky 2 5 Aron Chris 3 6 Maron Cheese 4 7 Matt Brooklyn 5 8 Brooklyn Federer 5 9 Ruselle Federer 5 10 Aron Ruselle 5
为了更好地理解,现在解释图2:
在图2中,我在第10行上添加了“ Aron”和“ Ruselle”。所以现在第5行从网络3更改为网络5,因为它们都已连接:]
由于布鲁克林,第7和8行已连接
由于费德勒,第8和9行已连接
第9行和第10行由于Ruselle而已连接网络
第5和10行由于Aron而已连接网络
(现在所有第5,7,8,9和10号线实际上都是一个网络,因为它们以某种方式连接)
标注:1)图2中的网络5也可以重命名为网络“ 3”,没有问题。拥有全部的主要想法作为一个网络的一部分将人们联系在一起2)我的列表不是动态的,不会从图1的列表增长到图2,所以我只需要一个可以在短期内完成工作的解决方案。现在不需要缩放解决方案3)我的表具有相同的两列,但几乎有40K唯一名称,因此我无法将任何名称硬编码到我的代码中4)名称也可以是字母,也可以是字母数字的数字。
我尝试使用复杂的完全联接和交叉联接,但这很繁琐。我阅读了有关R的igraph包的信息,这可能是我正在寻找的]
不确定我是否清楚地解释了我的问题。如有任何歉意,敬请谅解*
谢谢,奈尔
我有一个与社交网络有点相似的问题。我需要确定一个朋友网络中的所有候选人,并为该朋友网络提供一个网络名称或号码。我会...
这里是一个解决方案,基于sql server cte语法:
首先创建表:
create table net(s int, c1 varchar(20), c2 varchar(20))
下一步用您的数据填充:
insert net values (1,'Peet','Jackson') ,(2,'Jason','Filip') ,(3,'Luke','Filip') ,(4,'Jason','Becky') ,(5,'Aron','Chris') ,(6,'Maron','Cheese') ,(7,'Matt','Brooklyn') ,(8,'Brooklyn','Federer') ,(9,'Ruselle','Federer') ,(10,'Aron','Ruselle')
现在是CTE:
;with cte as ( select *, convert(varchar(1000),','+c1+','+c2) as network, s as MaxS from net union all select net.*, convert(varchar(1000),cte.network+',' +case when cte.network like '%'+net.c1+'%' then net.c2 else net.c1 end),net.s from net join cte on cte.network like '%'+','+net.c1+'%' or cte.network like '%'+','+net.c2+'%' where net.s>cte.MaxS ) , groups as ( select net.*, network, MaxS, row_number() over (partition by net.s order by len(network) desc) as longest from net join cte on cte.network like '%'+','+net.c1+'%' ) select s,c1,c2, dense_rank() over (order by MaxS) as groupno from groups where longest=1
结果:
s c1 c2 groupno
1 Peet Jackson 1
2 Jason Filip 2
3 Luke Filip 2
4 Jason Becky 2
6 Maron Cheese 3
7 Matt Brooklyn 4
8 Brooklyn Federer 4
9 Ruselle Federer 4
10 Aron Ruselle 4
5 Aron Chris 4
这里是一个解决方案,基于sql server cte语法: