用纯sql计算两个用户之间的链接强度

用纯sql计算两个用户之间的链接强度,sql,Sql,两个用户(伙伴)之间链路强度的一个度量如下: S=(普通伙伴的数量)/(人的伙伴的数量1人的联盟伙伴的数量2) 为了计算上述值,我开始编写以下查询: WITH user1 AS ( SELECT calling_party, called_party FROM monthly_connections WHERE calling_party = 'a' OR called_party ='a' ), user2 AS ( SELECT calling_party, called_party FRO

两个用户(伙伴)之间链路强度的一个度量如下:

S=(普通伙伴的数量)/(人的伙伴的数量1人的联盟伙伴的数量2)

为了计算上述值,我开始编写以下查询:

WITH user1 AS
(
SELECT calling_party, called_party FROM monthly_connections WHERE calling_party = 'a' OR called_party ='a'
),
user2 AS
(
SELECT calling_party, called_party FROM monthly_connections WHERE calling_party = 'b' OR called_party ='b'
),
commonUsers AS
(
SELECT COUNT (*) common_users_count FROM user1 u1 INNER JOIN user2 u2 ON u1.called_party = u2.called_party OR u1.calling_party = u2.calling_party OR u1.called_party = u2.calling_party OR u1.calling_party = u2.called_party
),
unionUsers AS
(
SELECT COUNT(*) FROM user1  UNION SELECT  COUNT(*) FROM user2
)
然后应该使用unionUsers的数量(不确定是否正确写入)作为分母。无论如何,我不知道如何完成程序,以获得所需的价值,所以我将感谢您的帮助


谢谢大家!

count(*)查询返回可以算术添加的标量。不需要使用UNION(这是一个集合运算)。

我想你想说的是,S是普通好友的数量,超过了1人或2人的好友总数

也许其他人会为您提供正确的SQL,但我认为以下是一些伪代码,它们将获得两个数字:

SELECT COUNT(*) as AllFriends, 
SUM(Case when A.FriendID is not null and B.FriendID is not null then 1 else 0 end) AS JointFriends FROM
(
  (SELECT FriendID from Friends WHERE PersonID=x) A
  FULL OUTER JOIN 
  (SELECT FriendID from Friends WHERE PersonID=y) B
  ON A.FriendID = B.FriendID
) C

分多个步骤处理可能更容易,因此您可以查看和检查中间输出

您需要一个具有userID pk的用户表,并且您需要将其与自身交叉连接(完全外部连接)以获得所有好友对,除了添加到where子句以排除userID=userID(自身。没有人是自己的好友或自己呼叫)的行之外。这定义了所有可能的好友连接集

您已经有了一组好友的每月连接表,calling buddy->called buddy。这定义了一种类型的伙伴连接

您需要另一个每月连接表的实例来交换好友,名为buddy->calling buddy。这定义了第二种类型的好友连接

您需要每月连接表的第三个实例和每月连接表的两个实例,在called字段中联接。确保在where子句中排除两个表中调用用户相等的行。如果两个不同的用户呼叫相同的第三个用户,则定义第三种类型的好友连接

现在,您可以确定每个好友对的普通好友数。这是三个集合的行数相加


有意义吗?

我认为你不需要“或”u1。calling_party=u2。calling_party'+1来获得答案,但是,我认为@niko希望看到代码。
WITH user1_buddies AS
(
SELECT called_party AS buddy FROM monthly_connections WHERE calling_party = '80A8A8D9D9AC58BE479C59D9BC59625691F32E76'
UNION SELECT calling_party AS buddy FROM monthly_connections WHERE called_party ='80A8A8D9D9AC58BE479C59D9BC59625691F32E76'
),
user2_buddies AS
(
SELECT calling_party AS buddy FROM monthly_connections WHERE  called_party ='11171309B5B6163D71B477D99D29763E4A7305E1'
UNION SELECT called_party AS buddy FROM monthly_connections WHERE calling_party = '11171309B5B6163D71B477D99D29763E4A7305E1'
),
commonUsers AS
(
SELECT cu.b1, cu.b2 FROM (SELECT u1.buddy b1, u2.buddy b2 FROM user1_buddies u1 INNER JOIN user2_buddies u2 ON u1.buddy = u2.buddy) cu
),
allUsers AS
(
SELECT b allUsersCount FROM (SELECT buddy b FROM user1_buddies UNION SELECT buddy b FROM user2_buddies) cu
)
SELECT(CAST((SELECT COUNT (*) FROM commonUsers) AS decimal(10,5)) / (CAST((SELECT COUNT (*) FROM allUsers) AS decimal(10,5)))) link_strength