两个用户(好友)之间的链接强度的一个衡量标准如下:
S =(普通好友的数量)/(person1的好友数量,人物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的数量(不确定是否正确写入)应该用作分母。无论如何,我不知道如何完成程序以获得所需的价值,所以我将非常感谢你的帮助。
谢谢!
答案 0 :(得分:1)
count(*)查询返回可以算术添加的标量。无需使用UNION(这是一个SET操作)。
答案 1 :(得分:0)
我认为你想说的是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
答案 2 :(得分:0)
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
答案 3 :(得分:0)
通过多个步骤处理它可能更容易,因此您可以查看并检查中间输出。
你需要一个带有userID pk的用户表,你需要与它自己交叉连接(全外连接)以获得所有伙伴对,除了添加到where子句以排除userID = userID的行(本身。没有人是他们自己的伙伴或自称。)这定义了所有可能的伙伴关系的集合。
您已经与一组好友建立了月度连接表,请致电好友 - >叫好友。这定义了一种伙伴连接。
您需要与交换好友的月连接表的另一个实例,称为好友 - >打电话给朋友。这定义了第二种类型的伙伴连接。
您需要每月连接表的第三个实例,其中包含每月连接表的2个实例,并在被调用字段上加入。确保在where子句中排除两个表中的调用用户相等的行。如果两个不同的用户呼叫相同的第三个用户,则它定义第三种类型的伙伴连接。
现在,您可以确定每个好友对的常见好友数量。它是这三个集合在一起的行数。
有意义吗?