2012-10-22 86 views
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 

我想解決方案將是一個遞歸函數,但不知道它!

回答

0

無法在普通SQL中計算傳遞閉包。它們是使用PL/SQL和類似語言的關鍵示例。你可能想看看相關的問題,例如:

mySQL transitive closure table

總之,你需要的搜索詞是關閉。你有一個關係,但你想要關閉關係。

+0

我的問題是在sql seerver 2008 – jozi

+0

糟糕。然後在SQL服務器文檔中搜索「傳遞閉包」! –

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); 
     } 
} 

,其結果是: enter image description here

然後:

var ClusterCount = db.Test.Select(x => x.Clus).Distinct().Count(); 

希望得到這個幫助!

+0

這個函數FirstFunc ??? Ans已更新 – jozi

+0

! – ARZ