牛客网刷题笔记-SQL65 异常的邮件概率

根据提供的邮件和用户表,需要计算每个日期内正常用户向正常用户发送邮件失败的概率。已知邮件表包含邮件状态(成功或失败),用户表包含用户是否为黑名单。查询结果应按日期升序排列并保留小数点后三位。示例结果显示,2020-01-11的概率为0.500,而2020-01-12的概率为0.000。

SQL65 异常的邮件概率

现在有一个需求,让你统计正常用户发送给正常用户邮件失败的概率:
有一个邮件(email)表,id为主键, type是枚举类型,枚举成员为(completed,no_completed),completed代表邮件发送是成功的,no_completed代表邮件是发送失败的。简况如下:

在这里插入图片描述
第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为主键,is_blacklist为0代表为正常用户,is_blacklist为1代表为黑名单用户,简况如下:

在这里插入图片描述
第1行表示id为1的是正常用户;
第2行表示id为2的不是正常用户,是黑名单用户,如果发送大量邮件或者出现各种情况就会容易发送邮件失败的用户
。。。
第4行表示id为4的是正常用户
现在让你写一个sql查询,每一个日期里面,正常用户发送给正常用户邮件失败的概率是多少,结果保留到小数点后面3位(3位之后的四舍五入),并且按照日期升序排序,上面例子查询结果如下:

在这里插入图片描述
结果表示:
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)

————————————————————————————————————————————————————

select date,round(sum(s)*1.0/count(s),3) as p
from(
select e.*,(case type when 'completed' then 0 when 'no_completed' then 1 end)as s
    from email e
where e.send_id in (select id 
                   from user
                   where is_blacklist=0)
and e.receive_id in (select id 
                     from user
                     where is_blacklist=0)) as r
group by date
order by date
牛客网笔记涵盖多个方面,以下是不同类型的笔记分享: - **单词消消乐**:牛妹会给牛牛n个单词,要求牛牛将这n个单词按照以下方式合并:从左往右合并单词,将合并后的单词作为第一个单词再与后面单词合并;如果最左边单词结尾字母与其后面一个的单词的开始字母相同,则最左边单词的结尾字母与之后一个单词的开始字母都会抵消掉而消失,重复上述操作直到某一个单词为空或者最左端的结尾字母与之后单词的开始字母不同,然后合并这两个单词作为一个单词放置再最左边。例如有三个单词"a",“b”,“c”,先将"ab"合并,最后将合并后的"ab"与"c"合并得到"abc" [^1]。 - **SQL考试分数问**:牛客每次举办企业笔试时,企业有不同的语言岗位,如C++工程师、JAVA工程师、Python工程师等,每个用户笔试完有不同的分数。需要找出每个岗位分数排名前2名的用户,得到的结果先按照language的name升序排序,再按照积分降序排序,最后按照grade的id升序排序。SQL查询语句如下: ```sql select g.id,name,score from( select *,dense_rank()over (partition by language_id order by score desc) as t_rank from grade ) g join language as l on g.language_id=l.id where t_rank<=2 order by name,score desc,id; ``` [^2] - **Java并发类相关**:Semaphore类,控制某个资源可被同时访问的个数;ReentrantLock类,具有和使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大;Future接口,表示异步计算的结果;CountDownLatch类,可以用来在一个线程中等待多个线程完成任务 [^3]。 - **删除公共字符**:具体思路是预先定义String result = ""作为输出结果。首先遍历str2字符串中的每个字符,将其存储到HashMap中(其中key为单个字符,value为该字符出现的次数);然后遍历str1字符串中的每个字符,str1与hashmap进行比较,通过hashmap.get(字符x)如果返回的value为null,则将此字符串加入到result输出结果中;最后输出result。详细代码实现如下: ```java import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str1 = scanner.nextLine(); String str2 = scanner.nextLine(); String result = ""; Map<Character, Integer> map = new HashMap<>(); for (int i = 0; i < str2.length(); i++) { if (map.get(str2.charAt(i)) == null) { map.put(str2.charAt(i), 1); } else { map.put(str2.charAt(i), map.get(str2.charAt(i)) + 1); } } for (int i = 0; i < str1.length(); i++) { if (map.get(str1.charAt(i)) == null) { result += str1.charAt(i); } } System.out.println(result); } } ``` [^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值