当我知道sql中每个集群中的点时,计算集群的数量
当我知道每个集群的所有成员时,我试图计算集群的数量 我需要SqlServer2008中的一个函数来解决这个问题 我的表有1400多万条不同的记录,如下所示:当我知道sql中每个集群中的点时,计算集群的数量,sql,sql-server,sql-server-2008,closures,Sql,Sql Server,Sql Server 2008,Closures,当我知道每个集群的所有成员时,我试图计算集群的数量 我需要SqlServer2008中的一个函数来解决这个问题 我的表有1400多万条不同的记录,如下所示: CREATE TABLE Test ( F1 varchar(5), F2 varchar(5) ) INSERT INTO TEST ( F1, F2) VALUES ( 'A', 'B') INSERT INTO TEST ( F1, F2 ) VALUES ( 'A', 'K') INSERT INTO TEST ( F
CREATE TABLE Test
(
F1 varchar(5),
F2 varchar(5)
)
INSERT INTO TEST ( F1, F2) VALUES ( 'A', 'B')
INSERT INTO TEST ( F1, F2 ) VALUES ( 'A', 'K')
INSERT INTO TEST ( F1, F2) VALUES ( 'C', 'H')
INSERT INTO TEST ( F1, F2 ) VALUES ( 'D', 'B')
INSERT INTO TEST ( F1, F2 ) VALUES ( 'F', 'I')
INSERT INTO TEST ( F1, F2 ) VALUES ( 'F', 'B')
INSERT INTO TEST ( F1, F2 ) VALUES ( 'D', 'H' )
INSERT INTO TEST ( F1, F2 ) VALUES ( 'E', 'G' )
INSERT INTO TEST ( F1, F2 ) VALUES ( 'G', 'L' )
请注意:
If A=B AND A=K THEN B=K
IF E=G AND G=L THEN E=L
现在,函数的输出应如下所示:
ClusterNumber--- point
1---A
1---B
1---k
1---D
1---F
1---I
1---H
1---C
2---E
2---G
2---L
我猜解决方案是递归函数,但我不知道 在普通SQL中无法计算可传递闭包。它们是使用PL/SQL和类似语言的关键示例。您可能需要研究相关问题,例如: 无论如何,你需要的搜索词是闭包。你有一个关系,但你想得到关系的闭包。我用C#在递归函数中使用EntityFrameWork和LINQ来解决它 -注意,我为clusterlabel添加了一个新的列Clus 因此,将此循环放在主代码中:
foreach (var item1 in db.Test.ToList())
{
FirstFunc(item1, item1.F1);
}
并使用以下功能:
private void FirstFunc(Test item1,string cc)
{
if (item1.Clus == null)
{
item1.Clus = cc;
db.SaveChanges();
RecFunc(item1, cc);
}
}
private void RecFunc(Test item1,string cc)
{
var t1 = db.Test.Where(x => (x.F1 == item1.F1 | x.F2 == item1.F1 | x.F1 == item1.F2| x.F2 == item1.F2) & x.Clus == null).ToList();
foreach (var item2 in t1)
{
item2.Clus = cc;
db.SaveChanges();
RecFunc(item2,cc);
}
}
结果是:
然后:
var ClusterCount = db.Test.Select(x => x.Clus).Distinct().Count();
希望这有帮助 我的问题是在SQLServer2008oops中。然后在SQL server文档中搜索“可传递闭包”!