邮件发送失败的概率,除去发件人或收件人为黑名单的情况

异常的邮件概率

http://www.nowcoder.com/questionTerminal/d6dd656483b545159d3aa89b4c26004e

方法1(常规思路):表1(日期,失败个数)表2(日期,邮件总数) ,最后用日期连接两表,分子除以分母计算概率。
select t2.date
,round(t1.c1/t2.c2,3)as p
from
(select date,count(id) as c1 
from email
where send_id in(select id from user where is_blacklist=0)
and receive_id in(select id from user where is_blacklist=0)
and  type='no_completed'
group by date )t1
join
(select date,count(id) as c2
from email
where send_id in(select id from user where is_blacklist=0)
and receive_id in(select id from user where is_blacklist=0)
group by date )t2
on t1.date=t2.date
order by t2.date;
方法2:sum+case方法计算失败次数,使用子查询过滤黑名单。
select e.date
			,round(sum(case type when 'no_completed' then 1 else 0 end)/count(id),3) as p
from email e
where send_id in(select id from user where is_blacklist=0)
and receive_id in(select id from user where is_blacklist=0)
group by e.date
order by e.date;
方法3:sum+case方法计算失败次数,使用join过滤黑名单。同一个表可以join多次,取不同别名即可。
select e.date
	   ,round(sum(case type when 'no_completed' then 1 else 0 end)/count(e.id),3) as p
from email e
join user u1 on e.send_id = u1.id 
join user u2 on u2.id = e.receive_id
where u1.is_blacklist = 0 and u2.is_blacklist=0
group by e.date
order by e.date;






全部评论
方法1运行结果不会现实p为0的情况
1 回复 分享
发布于 2023-09-10 15:12 湖南
大赞,思路很清晰,学着用方法1实现了1遍。 首先我们要排除黑户,所以选出send_id和recieved_id都不是黑户的id。 随后依照选出的统计成功的和失败的,分成两张表 最后再连接两张表,计算比例即可。
点赞 回复 分享
发布于 2024-10-19 10:09 广东
求助一下大佬,方法二where 后面换成 (send_id,receive_id) not in ( select id,id from user where is_blacklist =1) 为什么就不行了呢
点赞 回复 分享
发布于 2021-10-31 21:34

相关推荐

门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
评论
26
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务