我在客户端群集方面遇到问题。
我有一个数据集,其中包含诸如name
,address
,email
,phone
等列(例如A
,{{1 }},B
)。每行都有唯一的标识符(C
)。我需要为每行分配ID
(CLUSTER_ID
)。在一个群集中,所有行都具有与其他行相同的一个或多个属性。因此,具有X
的客户端具有相同的ID=1,2,3
属性,具有A
的客户端具有相同的ID=3,10
属性,则B
应该位于同一群集中。
如何使用SQL解决此问题? 如果不可能怎么写算法(伪代码)? 性能非常重要,因为数据集包含数百万行。
样本输入:
ID=1,2,3,10
样本输出:
ID A B C
1 A1 B3 C1
2 A1 B2 C5
3 A1 B10 C10
4 A2 B1 C5
5 A2 B8 C1
6 A3 B1 C4
7 A4 B6 C3
8 A4 B3 C5
9 A5 B7 C2
10 A6 B10 C3
11 A8 B5 C4
感谢您的帮助。
答案 0 :(得分:1)
一种可能的方法是对空X重复更新。
从cluster_id 1开始。 F.e.通过使用变量。
SET @CurrentClusterID = 1
获取前1条记录,并将其X更新为1。
现在循环更新带有空X的所有记录, 并且可以链接到X = 1且具有相同的A或B或C的记录
免责声明:
该声明将取决于RDBMS。
这只是作为伪代码。
WHILE (<<some check to see if there were records updated>>)
BEGIN
UPDATE yourtable t
SET t.X = @CurrentClusterID
WHERE t.X IS NULL
AND EXISTS (
SELECT 1 FROM yourtable d
WHERE d.X = @CurrentClusterID
AND (d.A = t.A OR d.B = t.B OR d.C = t.C)
);
END
循环直到更新0条记录。
现在对其他群集重复该方法,直到表中不再有空X。
1)将@CurrentClusterID增加1
2)使用空X将下一个前1条记录更新为新的@CurrentClusterID
3)循环更新,直到不再进行更新。
在 db <>提琴here 上针对MS Sql Server的示例测试。