sql - 当我知道sql中每个簇中的点时计算簇数

标签 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 ( 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

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

最佳答案

我在递归函数中使用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();

希望这有帮助!

关于sql - 当我知道sql中每个簇中的点时计算簇数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13004825/

相关文章:

sql - 指定哪一列在前 SQL

sql - Microsoft SQL Server 2008 外部备份

sql - 来自年月列的日期列 postgreSQL/SQL

php - Mysql/PHP 在一个查询中选择 Table1 或 Table2 中存在的行

mysql - 查询中的累积函数不会分组

sql-server - Jmeter - 找不到适合 jdbc :microsoft:sqlserver://x. x.x.x:1433 的驱动程序

处理子群体时的 SQL 查询语法错误

sql - 如何在 STRING_SPLIT 中保留 NULL 值

sql - 如何使用变量作为表名检查表是否存在

sql - 遗留数据库中的 upsize_ts 列 - 这是什么意思?