Ниже приведен запрос, который я создал для подсчета количества общих сильно связанных (подключенных в обоих направлениях) соседей двух пользователей:
DECLARE @monthly_connections_test TABLE (
calling_party VARCHAR(50)
, called_party VARCHAR(50))
INSERT INTO @monthly_connections_test
SELECT 'z1', 'z2'
UNION ALL SELECT 'z1', 'z3'
UNION ALL SELECT 'z1', 'z4'
UNION ALL SELECT 'z1', 'z5'
UNION ALL SELECT 'z1', 'z6'
UNION ALL SELECT 'z2', 'z1'
UNION ALL SELECT 'z2', 'z4'
UNION ALL SELECT 'z2', 'z5'
UNION ALL SELECT 'z2', 'z7'
UNION ALL SELECT 'z3', 'z1'
UNION ALL SELECT 'z4', 'z7'
UNION ALL SELECT 'z5', 'z1'
UNION ALL SELECT 'z5', 'z2'
UNION ALL SELECT 'z7', 'z4'
UNION ALL SELECT 'z7', 'z2'
SELECT t1.user1, t1.user2,
0 AS calling_calling, 0 AS calling_called,
0 AS called_calling, 0 AS called_called,
COUNT(*) AS both_directions
FROM (SELECT relevant_monthly_connections.calling_party AS user1,
relevant_monthly_connections_1.calling_party AS user2,
relevant_monthly_connections.called_party AS calledUser
FROM @monthly_connections_test relevant_monthly_connections
INNER JOIN @monthly_connections_test AS relevant_monthly_connections_1
ON relevant_monthly_connections.called_party = relevant_monthly_connections_1.called_party
AND relevant_monthly_connections.calling_party < relevant_monthly_connections_1.calling_party
) t1
INNER JOIN @monthly_connections_test AS relevant_monthly_connections_2
ON relevant_monthly_connections_2.called_party = t1.user1
AND relevant_monthly_connections_2.calling_party = t1.calledUser
GROUP BY t1.user1, t1.user2
Теперь я хотел бы подсчитать количество сильно связанных соседей пользователя1ИЛИ user2.Так, например, для пары (z1, z2) число сильносвязанных соседей равно 3 (z1 сильно связан с z2, z3, z5 и z2 игнорируется, так как это один из узлов в паре, а z2 сильно связан сz1, z5 и z7. опять же, z1 игнорируется и считается ((z3, z5) U (z5, z7)) 3).
Кто-нибудь знает, как создать запрос для подсчета количества всехузлы, которые сильно связаны с одним из узлов из пары для каждой пары (запрос должен автоматически рассчитывать количество всех соседей для каждой записи)?
Edit # 1:
Следующий запрос возвращает таблицу всех двунаправленных соединений:
WITH bidirectionalConnections AS
(
SELECT calling_party AS user1, called_party AS user2 FROM @monthly_connections_test WHERE calling_party < called_party
INTERSECT
SELECT called_party AS user2, calling_party AS user2 FROM @monthly_connections_test
)
SELECT user1, user2 FROM bidirectionalConnections
Теперь для каждой пары узлов в таблице bidirectionalConnections необходимо проверить, сколько узлов сильно связано с первым или вторымузел из пары.
Пары и количество их соседей в результате должны генерироваться автоматически.
Редактировать # 2:
Вот изображение, описанное таблицей @monthly_connections_test:
Итак, соседи, сильно связанные с z1 ИЛИ z2, это z3, z5, z7
z1, z3: z2, z5
z1, z4: z2, z3, z5, z7
...
z1, z7: z2, z3, z4, z5
...
Таблица результатов должна быть в следующем формате:
user1, user2, total_neighbors_count
z1, z2, 3
z1, z3, 2
z1, z4, 4
...
z1, z7, 4
...
Спасибо!
PS
Я отправил аналогичный вопрос Как использовать JOIN вместо UNION для подсчета соседей «A OR B»? но это не одно и то же, поэтому я надеюсь, что этот вопрос не будет считаться дубликатом.