题解 | #获取有奖金的员工相关信息。#
异常的邮件概率
http://www.nowcoder.com/practice/d6dd656483b545159d3aa89b4c26004e
解题思路
先思考如果要得到那个结果,那么期待的数据表是什么样子的?
分享下我的思考方式和过程,仅参考 :
- 第一步:首先生成的表中的列一定是有是日期、该日期中除去黑名单后的总邮件数目、该日期中除去黑名单后,发送失败的总邮件数目。
备注:因为这样就可以直接用发送失败的除以总的,来得到当日的发送失败率了。
- 第二步:根据要求,要去除黑名单的人,那我们正式操作的第一步就将不是黑名单的信息全部捞出来。
这一步具体的代码如下:
select id, type, date
from email
where send_id not in (select id from user where is_blacklist=1)
and receive_id not in (select id from user where is_blacklist=1)
- 第三步:则是需要将该数据形式转换为第一步中我们期待的数据形式。
这里就需要使用行列转换啦。脑子里有没有浮现那个经典的【学生-科目-成绩】表的行列转换?这里也是同样道理的。
最终完整代码如下所示:
select date,
round(sum(case when type='no_completed' then 1 else 0 end) / count(1),3) as 'p'
from (
select id, type, date
from email
where send_id not in (select id from user where is_blacklist=1)
and receive_id not in (select id from user where is_blacklist=1)
)s1
group by date
;