2

各クラスターのすべてのメンバーがわかっているときに、クラスターの数を計算しようとしています。

この問題を解決するには、SqlServer2008の関数が必要です。

私のテーブルには、次のような1,400万を超える個別のレコードがあります。

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

再帰関数EntityFrameWorkLINQを使用して 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();

この助けを願っています!

于 2012-10-22T10:14:30.527 に答える
0

推移閉包はプレーン SQL では計算できません。これらは、PL/SQL および同様の言語を使用するための重要な例です。次のような関連する質問を調べることができます。

MySQL 推移閉包表

とにかく、必要な検索語は閉鎖です。リレーションがありますが、リレーションのクロージャーを取得したいと考えています。

于 2012-10-22T05:52:26.667 に答える