Nachfolgend die Abfrage, die ich erstellt habe, um die Anzahl der gemeinsamen stark verbundenen (in beide Richtungen verbundenen) Nachbarn von zwei Benutzern zu zählen:
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
Jetzt möchte ich die stark verbundenen Nachbarn von user1 ODER user2 zählen. Also zum Beispiel für das Paar (z1, z2) die Anzahl der stark verbundenen Nachbarn ist 3 (z1 ist stark verbunden mit z2, z3, z5 und z2 wird ignoriert, da es einer der Knoten aus dem Paar ist und z2 ist stark verbunden mit z1, z5 und z7. wieder, z1 wird ignoriert und count((z3, z5) U (z5, z7)) ist 3).
Weiß jemand, wie die Abfrage zu erstellen, um die Anzahl aller Knoten zu zählen, die stark mit einem der Knoten aus dem Paar für jedes Paar verbunden sind (die Abfrage muss automatisch die Anzahl aller Nachbarn für jeden Datensatz berechnen)?
Bearbeiten #1:
Die folgende Abfrage gibt die Tabelle mit allen bidirektionalen Verbindungen zurück:
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
Nun muss für jedes Knotenpaar in der Tabelle bidirectionalConnections überprüft werden, wie viele Knoten stark mit dem ersten oder zweiten Knoten des Paares verbunden sind.
Die Paare und die Anzahl ihrer Nachbarn im Ergebnis müssen automatisch generiert werden.
Bearbeiten #2:
Hier ist das Bild, das durch die Tabelle @monthly_connections_test beschrieben wird:
Die Nachbarn, die eng mit z1 ODER z2 verbunden sind, sind also z3, z5, z7
z1, z3: z2, z5
z1, z4: z2, z3, z5, z7
...
z1, z7: z2, z3, z4, z5
...
Die Ergebnistabelle sollte das folgende Format haben:
user1, user2, total_neighbors_count
z1, z2, 3
z1, z3, 2
z1, z4, 4
...
z1, z7, 4
...
Ich danke Ihnen!
P.S.
Ich habe eine ähnliche Frage gestellt Wie kann man JOIN anstelle von UNION verwenden, um die Nachbarn von "A OR B" zu zählen? aber es ist nicht dasselbe, also hoffe ich, dass diese Frage nicht als Duplikat betrachtet wird.