102,SQL训练之,力扣,597. 好友申请 I:总体通过率

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

表:FriendRequest

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| sender_id      | int     |
| send_to_id     | int     |
| request_date   | date    |
+----------------+---------+
该表可能包含重复项(换句话说,在SQL中,该表没有主键)。
该表包含发送请求的用户的 ID ,接受请求的用户的 ID 以及请求的日期。

表:RequestAccepted

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| requester_id   | int     |
| accepter_id    | int     |
| accept_date    | date    |
+----------------+---------+
该表可能包含重复项(换句话说,在SQL中,该表没有主键)。
该表包含发送请求的用户的 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

进阶:

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

三,建表语句

;
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');



-- 向 FriendRequest 表插入数据
INSERT INTO FriendRequest (sender_id, send_to_id, request_date)
VALUES (1, 2, '2016-06-01'),
       (1, 3, '2016-06-01'),
       (1, 4, '2016-06-01'),
       (2, 3, '2016-06-02');

-- 向 RequestAccepted 表插入数据
INSERT INTO RequestAccepted (requester_id, accepter_id, accept_date)
VALUES (1, 2, '2016-06-03'),
       (1, 3, '2016-06-08'),
       (2, 3, '2016-06-08'),
       (3, 4, '2016-06-09');

select * from friendrequest;
select * from requestaccepted;

四,分析

题解:

表1:发送表

字段:发送者id,接受者id,发送日期

表2 接受表

字段:发送者,接受者id 接受日期

求申请好友的通过率   结果要求四舍五入 且做一个空值转换

第一步,对两个表去重


with t1 as (
    select distinct sender_id, send_to_id from friendrequest
),t2 as (
   select distinct requester_id,accepter_id from RequestAccepted

第二步,求出通过率 并且空值转换,且四舍五入

五,SQL解答


with t1 as (
    select distinct sender_id, send_to_id from friendrequest
),t2 as (
   select distinct requester_id,accepter_id from RequestAccepted
),t3 as (
    select
   ( (select count(1) cnt1 from t2)
/
    (select count(1) cnt2 from t1) )  as a
)
select round(ifnull(a,0),2)  as accept_rate from t3;

六,验证

七,知识点总结

  • 通过的条数/申请的条数  = 通过率
  • 去重的运用
  • 四舍五入的运用
  • null值转为0的运用

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值