【发布时间】:2010-12-03 11:56:29
【问题描述】:
以下是我创建的查询,用于计算两个用户的共同强连接(双向连接)邻居的数量:
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
现在我想计算 user1 或 user2 的强连接邻居。因此,例如对于 (z1, z2) 对,强连接邻居的数量为 3(z1 与 z2、z3、z5 强连接,并且 z2 被忽略,因为它是该对中的节点之一,而 z2 与z1、z5 和 z7。同样,z1 被忽略,count((z3, z5) U (z5, z7)) 为 3)。
有谁知道如何创建查询来计算与每对中的一个节点强连接的所有节点的数量(查询必须自动计算每条记录的所有邻居的数量)?
编辑#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 OR 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
...
谢谢!
附言
我已经发布了类似的问题How to use JOIN instead of UNION to count the neighbors of “A OR B”?,但它不一样,所以我希望这个问题不要被视为重复。
【问题讨论】:
-
原始问题和编辑#2 之间强连接邻居的定义发生了变化——最初,(z1,z2) 有 3 个强连接邻居,但在编辑#2 中他们有 4 个。哪个是正确的?
-
3 是正确的。感谢您的关注!
标签: sql sql-server graph social-networking