首页 > 试题广场 >

异常的邮件概率

[编程题]异常的邮件概率
  • 热度指数:156285 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
现在有一个需求,让你统计正常用户发送给正常用户邮件失败的概率:
有一个邮件(email)表,id为主键, type是枚举类型,枚举成员为(completed,no_completed),completed代表邮件发送是成功的,no_completed代表邮件是发送失败的。简况如下:
id send_id receive_id type date
1
2
3
4
5
6
2
1
1
3
3
4
3
3
4
1
4
1
completed
completed
no_completed
completed
completed
completed
2020-01-11
2020-01-11
2020-01-11
2020-01-12
2020-01-12
2020-01-12

第1行表示为id为2的用户在2020-01-11成功发送了一封邮件给了id为3的用户;
...
第3行表示为id为1的用户在2020-01-11没有成功发送一封邮件给了id为4的用户;
...
第6行表示为id为4的用户在2020-01-12成功发送了一封邮件给了id为1的用户;


下面是一个用户(user)表,id为主键(注意这里id代表用户编号),is_blacklist为0代表为正常用户,is_blacklist为1代表为黑名单用户,简况如下:
id is_blacklist
1
2
3
4
0
1
0
0
第1行表示id为1的是正常用户;
第2行表示id为2的不是正常用户,是黑名单用户,如果发送大量邮件或者出现各种情况就会容易发送邮件失败的用户
...
第4行表示id为4的是正常用户

现在让你写一个sql查询,每一个日期里面,正常用户发送给正常用户邮件失败的概率是多少,结果保留到小数点后面3位(3位之后的四舍五入),并且按照日期升序排序,上面例子查询结果如下:
date p
2020-01-11
2020-01-12
0.500
0.000

结果表示:
2020-01-11失败的概率为0.500,因为email的第1条数据,发送的用户id为2是黑名单用户,所以不计入统计,正常用户发正常用户总共2次,但是失败了1次,所以概率是0.500;
2020-01-12没有失败的情况,所以概率为0.000.
(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round)


示例1

输入

drop table if exists email;
drop table if exists user;
CREATE TABLE `email` (
`id` int(4) NOT NULL,
`send_id` int(4) NOT NULL,
`receive_id` int(4) NOT NULL,
`type` varchar(32) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`));

CREATE TABLE `user` (
`id` int(4) NOT NULL,
`is_blacklist` int(4) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO email VALUES
(1,2,3,'completed','2020-01-11'),
(2,1,3,'completed','2020-01-11'),
(3,1,4,'no_completed','2020-01-11'),
(4,3,1,'completed','2020-01-12'),
(5,3,4,'completed','2020-01-12'),
(6,4,1,'completed','2020-01-12');

INSERT INTO user VALUES
(1,0),
(2,1),
(3,0),
(4,0);

输出

2020-01-11|0.500
2020-01-12|0.000
头像 SunburstRun
发表于 2020-08-17 17:34:31
要想到题目要求求的是  正常用户发送邮件失败的数目/正常用户发送邮件总数目,所以必然要连接user表排除掉黑名单用户, 所以第一时间写出来的是: select xxx  from email join user as  展开全文
头像 失败的cc
发表于 2020-12-19 21:37:32
select date, round(sum(type = "no_completed") / count(*), 3) as p from email as t1 join user as t2 on t1.send_id = t2.id join user as t3 on t1 展开全文
头像 qstalking
发表于 2021-01-25 19:19:43
方法1(常规思路):表1(日期,失败个数)表2(日期,邮件总数) ,最后用日期连接两表,分子除以分母计算概率。 select t2.date ,round(t1.c1/t2.c2,3)as p from (select date,count(id) as& 展开全文
头像 高质量搬砖人
发表于 2021-02-01 10:10:39
方法)CASE WHEN + GROUP BY 结果保留到小数点后面3位(3位之后的四舍五入) 按照日期升序排序 SELECT date, ROUND(SUM(CASE type WHEN 'completed' THEN 0 ELSE 1 END)*1.0/ COUNT(type),3 ) 展开全文
头像 此用户名涉嫌违规
发表于 2021-03-29 14:56:45
题目描述:sql查询,每一个日期里面,正常用户发送给正常用户邮件失败的概率是多少,结果保留到小数点后面3位(3位之后的四舍五入),并且按照日期升序排序。 方法一(多表联结),先找出正常用户发送失败的次数。 select date,count(id) as num from email where s 展开全文
头像 多读都
发表于 2022-03-02 19:02:01
筛选出黑名单用户 /不是黑名单用户 做区分 然后使用 WHERE 限制 筛选中不包含黑名单用户; 3.计算 失败率;分天--> 必定GROUP BY, 然后累计的时候是 部分判定/整体count(),因此 用avg() 嵌套:if()/case when SELECT date, 展开全文
头像 糖团
发表于 2020-10-05 20:07:52
selectdate,cast( count(case when type='no_completed' then 1 else null end)*1.0 / count(id) as decimal(10,3)) 'p'from emailwhere send_id in (select id 展开全文
头像 莫折枝
发表于 2021-08-17 20:43:51
题目要我们找到邮件异常的概率: 简单分析分为三个步骤 找到那天所有发送的邮件总数 sum 表一 找到那天所有发送失败的邮件总数 fal 表二 sum/fal 就是发送失败的概率,所以我们要把两张表连接起来 找到那天所有发送的邮件总数 sum 表一 select date,count(*) a 展开全文
头像 109号
发表于 2020-12-06 13:16:39
两种方法: 使用联结,分别计算正常用户发送邮件的总次数和发送失败的次数,再计算失败的比率: 使用case计算正常用户发送邮件失败的次数,再计算失败的比率 使用联结,这是比较容易想起来的方法: 计算正常用户发送邮件失败的次数 SELECT date,COUNT(id) AS cnt1 FROM e 展开全文
头像 啊坡糍嘚
发表于 2021-09-19 09:38:29
select date,round(sum(case when type='no_completed' then 1 else 0 end)/count(type),3) as p from email where send_id in (select id from user where is_ 展开全文