zoukankan      html  css  js  c++  java
  • SQL练习题40:现在有一个需求,让你统计正常用户发送给正常用户邮件失败的概率

    题目:(浏览器不支持插图???详情去牛客网上看看)

    现在有一个需求,让你统计正常用户发送给正常用户邮件失败的概率:
    有一个邮件(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 e.date AS a, ROUND(SUM(CASE e.type WHEN 'no_completed' then 1 ELSE 0 END) * 1.0 / COUNT(e.type),3)
    FROM email AS e
    INNER JOIN user AS u1 ON (e.send_id = u1.id AND u1.is_blacklist = 0)
    INNER JOIN user AS u2 ON (e.receive_id = u2.id AND u2.is_blacklist = 0)
    GROUP BY e.date
    ORDER BY a;
    
    代码:
  • 相关阅读:
    Redis-持久化
    Redis-Sort命令
    Redis-ZSet常用命令
    Redis-Hash
    Redis-Set常用命令
    Redis-List常用命令
    Redis-String常用命令
    访问控制
    c++之旅:多态
    c++之旅:类型的强制转换
  • 原文地址:https://www.cnblogs.com/zhuozige/p/13908655.html
Copyright © 2011-2022 走看看