暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

单挑力扣(LeetCode)SQL笔试题:597. 好友申请 I:总体通过率(难度:简单)

跟强哥学SQL 2023-02-06
161
题目:597. 好友申请 I:总体通过率
(通过次数17,715 | 提交次数40,757,通过率43.46%)
    表:FriendRequest
    +----------------+---------+
    | Column Name | Type |
    +----------------+---------+
    | sender_id | int |
    | send_to_id | int |
    | request_date | date |
    +----------------+---------+
    此表没有主键,它可能包含重复项。
    该表包含发送请求的用户的 ID ,接受请求的用户的 ID 以及请求的日期。


    表:RequestAccepted
    +----------------+---------+
    | Column Name | Type |
    +----------------+---------+
    | requester_id | int |
    | accepter_id | int |
    | accept_date | date |
    +----------------+---------+
    此表没有主键,它可能包含重复项。
    该表包含发送请求的用户的 ID ,接受请求的用户的 ID 以及请求通过的日期。


    写一个查询语句,求出好友申请的通过率,用 2 位小数表示。通过率由接受好友申请的数目除以申请总数。


    提示:
    通过的好友申请不一定都在表friend_request中。你只需要统计总的被通过的申请数(不管它们在不在表FriendRequest中),并将它除以申请总数,得到通过率
    一个好友申请发送者有可能会给接受者发几条好友申请,也有可能一个好友申请会被通过好几次。这种情况下,重复的好友申请只统计一次。
    如果一个好友申请都没有,你应该返回accept_rate为 0.00


    查询结果应该如下例所示。
    示例 1
    输入:
    FriendRequest 表:
    +-----------+------------+--------------+
    | sender_id | send_to_id | request_date |
    +-----------+------------+--------------+
    | 1 | 2 | 2016/06/01 |
    | 1 | 3 | 2016/06/01 |
    | 1 | 4 | 2016/06/01 |
    | 2 | 3 | 2016/06/02 |
    | 3 | 4 | 2016/06/09 |
    +-----------+------------+--------------+
    RequestAccepted 表:
    +--------------+-------------+-------------+
    | requester_id | accepter_id | accept_date |
    +--------------+-------------+-------------+
    | 1 | 2 | 2016/06/03 |
    | 1 | 3 | 2016/06/08 |
    | 2 | 3 | 2016/06/08 |
    | 3 | 4 | 2016/06/09 |
    | 3 | 4 | 2016/06/10 |
    +--------------+-------------+-------------+
    输出:
    +-------------+
    | accept_rate |
    +-------------+
    | 0.8 |
    +-------------+
    解释:
    总共有 5 个请求,有 4 个不同的通过请求,所以通过率是 0.80


    进阶:
    你能写一个查询语句得到每个月的通过率吗?
    你能求出每一天的累计通过率吗?


    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/friend-requests-i-overall-acceptance-rate

      #测试数据
      Create table If Not Exists FriendRequest (sender_id int, send_to_id int, request_date date);
      Create table If Not Exists RequestAccepted (requester_id int, accepter_id int, accept_date date);


      insert into FriendRequest (sender_id, send_to_id, request_date) values ('1', '2', '2016/06/01');
      insert into FriendRequest (sender_id, send_to_id, request_date) values ('1', '3', '2016/06/01');
      insert into FriendRequest (sender_id, send_to_id, request_date) values ('1', '4', '2016/06/01');
      insert into FriendRequest (sender_id, send_to_id, request_date) values ('2', '3', '2016/06/02');
      insert into FriendRequest (sender_id, send_to_id, request_date) values ('3', '4', '2016/06/09');


      insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('1', '2', '2016/06/03');
      insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('1', '3', '2016/06/08');
      insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('2', '3', '2016/06/08');
      insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('3', '4', '2016/06/09');
      insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('3''4''2016/06/10');
      解题思路:
      FriendRequest表保存了所有添加好友的请求记录。
      RequestAccepted表保存了所有通过请求的记录。
      题目要求:计算添加好友的通过率。
      很明显:通过率=通过的数量 总的添加请求数量。
      分子和分母分别可以从RequestAccepted和FriendRequest表中计算得出。只是两个表的数据都可能会重复,所以需要先去重,再计算数量。比较简洁的做法是使用COUNT(DISTINCT *)的方法。
      最后,分子除以分母得出通过率,然后使用ROUND函数保留两位小数即可。
      参考SQL:
        with
        tmp1 as (
        select
        count(distinct concat(sender_id,'@',send_to_id)) all_cnt
        from FriendRequest
        ),
        tmp2 as (
        select
        count(distinct concat(requester_id,'@',accepter_id)) accept_cnt
        from RequestAccepted
        )
        select
        round(case when a.all_cnt = 0 then 0 else coalesce(b.accept_cnt,0)/a.all_cnt end,2) accept_rate
        from tmp1 a
        left join tmp2 b
        on 1 = 1;

        单挑力扣(LeetCode)SQL笔试题:577. 员工奖金(难度:简单)
        单挑力扣(LeetCode)SQL笔试题:586. 订单最多的客户(难度:简单)
        单挑力扣(LeetCode)SQL笔试题:596. 超过5名学生的课(难度:简单)


        笔试题合集免费领取方法


        方法一:关注公众号【跟强哥学SQL】,回复关键字【力扣】获取链接。

        方法二:访问SQL网页面:https://sql.wang/sql-leetcode/sql-exercise



        文章转载自跟强哥学SQL,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论