R或SQL代码:如何在表中标识所有连接的值以标识唯一的网络

问题描述 投票:-1回答:1

我有一个与社交网络有点相似的问题。我需要确定一个朋友网络中的所有候选人,并为该朋友网络提供一个网络名称或号码。我将不得不用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 r recursion social-networking network-analysis
1个回答
0
投票

这里是一个解决方案,基于sql server cte语法:

© www.soinside.com 2019 - 2024. All rights reserved.