我有一个匿名的表,其中有两列:UserId和PhoneNumber。
从“呼叫详细信息”记录表中选择。现在我想基于用户之间的相似性创建一个网络。如果用户呼叫至少3个相同的号码,则应该在用户之间建立连接。
行数超过2000万。当我使用用C#编写的简单程序时,完成此任务需要4天以上。我想知道,是否有可能编写SQL查询,这会给我相同的结果,如果存在相似性,只需在一个包含两列(user1和user2)的新表中插入一行,或者只是将其输出到输出中?
也许有其他好的解决方案来完成这项任务?
答案 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)上有索引,除非您的优化器会在幕后自动创建一个索引。