Нахождение сходства между пользователями в телекоммуникационной сети - PullRequest
3 голосов
/ 07 мая 2011

У меня есть анонимная таблица , в которой есть два столбца: UserId и PhoneNumber.

Он был выбран из таблицы записей сведений о вызове.Теперь я хотел бы создать сеть на основе сходства между пользователями.Должна быть связь между пользователями, если они звонили по крайней мере на 3 одинаковых номера.

Есть более 20 миллионов строк.Когда я использую простую программу, написанную на C #, это заняло бы более 4 дней.Интересно, можно ли написать SQL-запрос, который дал бы мне тот же результат, и если есть сходство, просто вставьте строку в новую таблицу с двумя столбцами, user1 и user2, или просто передайте ее на выход?

Может быть, есть другое хорошее решение для выполнения этой задачи?

1 Ответ

2 голосов
/ 07 мая 2011

Предполагая, что ваша таблица называется 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), если ваш оптимизатор не создаст его автоматически за кулисами.

...