当我知道每个集群的所有成员时,我正在尝试计算集群的数量。
我需要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 ( 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
我猜解决方案是一个递归函数,但不知道!
最佳答案
我在递归函数中使用EntityFrameWork和LINQ在C#中解决了这个问题!
-请注意,我为集群标签添加了一个新列 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();
希望这有帮助!
关于sql - 当我知道sql中每个簇中的点时计算簇数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13004825/