寻找电信网络中用户之间的相似性

时间:2011-05-07 17:39:02

标签: sql tsql sql-server-2008 business-intelligence

我有一个匿名的表,其中有两列:UserId和PhoneNumber。

从“呼叫详细信息”记录表中选择。现在我想基于用户之间的相似性创建一个网络。如果用户呼叫至少3个相同的号码,则应该在用户之间建立连接。

行数超过2000万。当我使用用C#编写的简单程序时,完成此任务需要4天以上。我想知道,是否有可能编写SQL查询,这会给我相同的结果,如果存在相似性,只需在一个包含两列(user1和user2)的新表中插入一行,或者只是将其输出到输出中?

也许有其他好的解决方案来完成这项任务?

1 个答案:

答案 0 :(得分:2)

假设您的表名为CallingList,那么您应该可以使用如下查询:

SELECT C1.UserID AS User1, C2.UserID AS User2
  FROM CallingList AS C1
  JOIN CallingList AS C2 ON C1.PhoneNumber = C2.PhoneNumber
 WHERE C1.UserID < C2.UserID
 GROUP BY C1.UserID, C2.UserID
HAVING COUNT(*) >= 3

是否会比C#更快还有待观察。

确保您在CallingList(PhoneNumber)上有索引,除非您的优化器会在幕后自动创建一个索引。