SQL:597. 好友申请 1-2

数据

在 Facebook 或者 Twitter 这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请。

表: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 以及请求通过的日期。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/friend-requests-i-overall-acceptance-rate
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

597. 好友申请 I:总体通过率

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);
Truncate table FriendRequest;
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');
Truncate table RequestAccepted;
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');

题目

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

提示:

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

查询结果应该如下例所示:

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  |
+--------------+-------------+-------------+

Result 表:
+-------------+
| accept_rate |
+-------------+
| 0.8         |
+-------------+
总共有 5 个请求,有 4 个不同的通过请求,所以通过率是 0.80

进阶:

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

解题记录

  • 这个题好像有点歧义的,按照官方的解答是只要通过表里就算通过,请求表里的就算请求,用通过总数比上请求总数就是通过率
with r as (select distinct sender_id, send_to_id from FriendRequest),
     a as (select distinct requester_id, accepter_id from RequestAccepted)
select round(ifnull((select count(1) from a)/(select count(1) from r), 0), 2) accept_rate
  • 我理解的通过率是请求的通过了,和请求的总数比较
with t as (select concat(sender_id,'-', send_to_id) request from FriendRequest group by request),
     t1 as (select concat(requester_id, '-', accepter_id) accept, 1 pick from RequestAccepted group by accept),
     t2 as (select ifnull(t1.pick, 0) pick from t left join t1 on t.request = t1.accept)
select ROUND(ifnull((select sum(pick) from t2)/(select count(pick) from t2), 0), 2) accept_rate

image-20210331210654014

602. 好友申请 II :谁有最多的好友

Create table If Not Exists request_accepted ( requester_id INT NOT NULL, accepter_id INT NULL, accept_date DATE NULL);
Truncate table request_accepted;
insert into request_accepted (requester_id, accepter_id, accept_date) values ('1', '2', '2016/06/03');
insert into request_accepted (requester_id, accepter_id, accept_date) values ('1', '3', '2016/06/08');
insert into request_accepted (requester_id, accepter_id, accept_date) values ('2', '3', '2016/06/08');
insert into request_accepted (requester_id, accepter_id, accept_date) values ('3', '4', '2016/06/09');

题目

写一个查询语句,求出谁拥有最多的好友和他拥有的好友数目。对于上面的样例数据,结果为:

| id   | num  |
| ---- | ---- |
| 3    | 3    |

注意:

保证拥有最多好友数目的只有 1 个人。
好友申请只会被接受一次,所以不会有 requester_id 和 accepter_id 值都相同的重复记录。

解释:

编号为 ‘3’ 的人是编号为 ‘1’,‘2’ 和 ‘4’ 的好友,所以他总共有 3 个好友,比其他人都多。

进阶:

在真实世界里,可能会有多个人拥有好友数相同且最多,你能找到所有这些人吗?

解题记录

  • 通过union all 将接受和请求的人数放到一起,然后通过聚合加和并排序,因为是只有一个人,故limit 1 即可
with t as (
    select requester_id id, count(*) cnt from request_accepted group by requester_id
    union all
    select accepter_id id, count(*) cnt from request_accepted group by accepter_id
)
select id, sum(cnt) num from t group by id order by num desc limit 1

image-20210331213228006

进阶

  • 通过刷选总数等于最大值即可
with t as (
    select requester_id id, count(*) cnt from request_accepted group by requester_id
    union all
    select accepter_id id, count(*) cnt from request_accepted group by accepter_id
),
    t2 as (select id, sum(cnt) num from t group by id)
select * from t2 where num = (select max(num) from t2)

image-20210331213503536

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页