Plus力扣2720 受欢迎度百分比

力扣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 升序排序结果。

  1. 使用 UNION 将 user1user2 合并到一个列中,以获取平台上所有独特的用户。
  2. 使用子查询或临时表(CTE)统计每个用户的朋友总数。
  3. 计算总用户数。
  4. 计算每个用户的受欢迎度百分比,并使用 ROUND 函数保留两位小数。
  5. 按照 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;

通过

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊昊该干饭了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值