力扣Plus题:编写一条 SQL 查询,找出 Meta/Facebook 平台上每个用户的受欢迎度的百分比。受欢迎度百分比定义为用户拥有的朋友总数除以平台上的总用户数,然后乘以 100,并 四舍五入保留 2 位小数
题目描述
表:Friends
+-------------+------+ | 列名 | 类型 | +-------------+------+ | user1 | int | | user2 | int | +-------------+------+ (user1, user2) 是该表的主键(具有唯一值的列)。 每一行包含关于朋友关系的信息,其中 user1 和 user2 是朋友。
编写一条 SQL 查询,找出 Meta/Facebook 平台上每个用户的受欢迎度的百分比。受欢迎度百分比定义为用户拥有的朋友总数除以平台上的总用户数,然后乘以 100,并 四舍五入保留 2 位小数 。
返回按照 user1
升序 排序的结果表。
查询结果格式如下示例所示。
示例 1:
输入: Friends 表: +-------+-------+ | user1 | user2 | +-------+-------+ | 2 | 1 | | 1 | 3 | | 4 | 1 | | 1 | 5 | | 1 | 6 | | 2 | 6 | | 7 | 2 | | 8 | 3 | | 3 | 9 | +-------+-------+ 输出: +-------+-----------------------+ | user1 | percentage_popularity | +-------+-----------------------+ | 1 | 55.56 | | 2 | 33.33 | | 3 | 33.33 | | 4 | 11.11 | | 5 | 11.11 | | 6 | 22.22 | | 7 | 11.11 | | 8 | 11.11 | | 9 | 11.11 | +-------+-----------------------+ 解释: 平台上总共有 9 个用户。 - 用户 "1" 与 2、3、4、5 和 6 是朋友。因此,用户 1 的受欢迎度百分比计算为(5/9)* 100 = 55.56。 - 用户 "2" 与 1、6 和 7 是朋友。因此,用户 2 的受欢迎度百分比计算为(3/9)* 100 = 33.33。 - 用户 "3" 与 1、8 和 9 是朋友。因此,用户 3 的受欢迎度百分比计算为(3/9)* 100 = 33.33。 - 用户 "4" 与 1 是朋友。因此,用户 4 的受欢迎度百分比计算为(1/9)* 100 = 11.11。 - 用户 "5" 与 1 是朋友。因此,用户 5 的受欢迎度百分比计算为(1/9)* 100 = 11.11。 - 用户 "6" 与 1 和 2 是朋友。因此,用户 6 的受欢迎度百分比计算为(2/9)* 100 = 22.22。 - 用户 "7" 与 2 是朋友。因此,用户 7 的受欢迎度百分比计算为(1/9)* 100 = 11.11。 - 用户 "8" 与 3 是朋友。因此,用户 8 的受欢迎度百分比计算为(1/9)* 100 = 11.11。 - 用户 "9" 与 3 是朋友。因此,用户 9 的受欢迎度百分比计算为(1/9)* 100 = 11.11。 user1 按升序排序。
解题思路
我们需要遵循几个步骤。首先,我们要统计每个用户的朋友数量,这包括他们作为 user1
以及 user2
出现的情况。其次,我们需要计算平台上的总用户数,这要求我们从两列中找出所有独特的用户。最后,我们将使用这些信息来计算每个用户的受欢迎度百分比,并按照 user1
升序排序结果。
- 使用 UNION 将
user1
和user2
合并到一个列中,以获取平台上所有独特的用户。 - 使用子查询或临时表(CTE)统计每个用户的朋友总数。
- 计算总用户数。
- 计算每个用户的受欢迎度百分比,并使用 ROUND 函数保留两位小数。
- 按照
user1
升序排序结果。
完整代码
WITH FriendCounts AS (
SELECT u1 as user, COUNT(distinct u2) AS friend_count
FROM (
SELECT user1 AS u1, user2 as u2 FROM Friends
UNION ALL
SELECT user2 AS u1, user1 as u2 FROM Friends
) AS AllFriendships
GROUP BY u1
),
TotalUsers AS (
SELECT COUNT(distinct user) AS total FROM (
SELECT user1 AS user FROM Friends
UNION
SELECT user2 FROM Friends
)t1
)
SELECT FC.user AS user1,
ROUND((FC.friend_count / (SELECT total FROM TotalUsers) * 100), 2) AS percentage_popularity
FROM FriendCounts FC
ORDER BY FC.user;
通过