2

当我知道每个集群的所有成员时,我正在尝试计算集群的数量。

我需要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

我想解决方案将是一个递归函数,但不知道!

4

2 回答 2

2

我在 C# 中使用EntityFrameWorkLINQ递归函数中解决它!

- 请注意,我为集群标签添加了一个新列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();

希望这有帮助!

于 2012-10-22T10:14:30.527 回答
0

传递闭包不能在普通 SQL 中计算。它们是使用 PL/SQL 和类似语言的关键示例。您可能想研究相关问题,例如:

mySQL 传递闭包表

无论如何,您需要的搜索词是关闭。你有一个关系,但你想关闭这个关系。

于 2012-10-22T05:52:26.667 回答