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;
    
    代码:
  • 相关阅读:
    10 个雷人的注释,就怕你不敢用!
    Java 14 之模式匹配,非常赞的一个新特性!
    poj 3661 Running(区间dp)
    LightOJ
    hdu 5540 Secrete Master Plan(水)
    hdu 5584 LCM Walk(数学推导公式,规律)
    hdu 5583 Kingdom of Black and White(模拟,技巧)
    hdu 5578 Friendship of Frog(multiset的应用)
    hdu 5586 Sum(dp+技巧)
    hdu 5585 Numbers
  • 原文地址:https://www.cnblogs.com/zhuozige/p/13908655.html
Copyright © 2011-2022 走看看