一、题目
两张表
1、FriendRequest表
表里面数据不唯一
有以下三个字段:
sender_id,发送请求的用户id
send_to_id,接受请求的用户id
send_date,请求日期
2、RequestAccepted表
表里面数据不唯一
有以下三个字段:
requester_id,发送请求的用户id
accepter_id,接受请求的用户id
accept_date,接受请求的日期
二、题目要求
求好友申请的通过率:
1、用接受好友申请的数目除以申请总数
2、通过的好友申请不一定都在FriendRequest表中
3、一个好友申请者可能会给接受者发多次好友申请,一个好友申请也有可能被通过好几次,这种情况接受和申请都只算一次
3、没有好友申请,则返回accept_rate为0.00
三、示例
1、从FriendRequest表看
(sender_id,send_to_id)这两个字段组合值没有重复的数据,申请表有5条数据 ,那么好友申请数量至少是5条
2、再看RequestAccepted表里面的(sender_id,send_to_id)组合数据都在FriendRequest表里面,没有额外不存在于FriendRequest表的好友申请,所以好友申请数目是5
3、看好友申请通过的数目,看RequestAccepted表里面
(sender_id,send_to_id)组合不重复的数据有4条,所以好友接受请求的数量是5
4、好友通过率 = 好友接受请求的数量 / 好友申请的数量,也就是4/5=0.8,保留两位小数就是0.80
四、分析
通过的好友申请不一定都在FriendRequest表中:
1、这句话如果是说好友申请不一定都通过,那么好友申请数目就可以直接在FriendRequest表查
2、如果这句话的意思是通过的好友申请可能在FriendRequest表里面没有,那么好友申请数目就得在FriendRequest表和RequestAccepted表里查
看题目的意思是第一种
①先从FriendRequest 表找出好友申请总数
select count(distinct sender_id,send_to_id) as request_num from FriendRequest
②从RequestAccepted表找出申请通过的数量
select count(distinct requester_id,accepter_id) as accept_num from RequestAccepted
③用上面两段sql作为两个临时表,用申请通过数量/好友申请总数,保留两位小数用round(exp,2)
五、sql实现
with tmp1 as(
select count(distinct sender_id,send_to_id) as request_num from FriendRequest
),
tmp2 as (
select count(distinct requester_id,accepter_id) as accept_num from RequestAccepted
)
select round(ifnull(accept_num/request_num,0) ,2) as accept_rate
from tmp1,tmp2