zoukankan      html  css  js  c++  java
  • sum+case 计数

    牛客每天有很多人登录,请你统计一下牛客每个日期登录新用户个数,
    有一个登录(login)记录表,简况如下:

    第1行表示id为2的用户在2020-10-12使用了客户端id为1的设备登录了牛客网,因为是第1次登录,所以是新用户
    。。。
    第4行表示id为2的用户在2020-10-13使用了客户端id为2的设备登录了牛客网,因为是第2次登录,所以是老用户
    。。
    最后1行表示id为4的用户在2020-10-15使用了客户端id为1的设备登录了牛客网,因为是第2次登录,所以是老用户


    请你写出一个sql语句查询每个日期登录新用户个数,并且查询结果按照日期升序排序,上面的例子查询结果如下:


    查询结果表明:
    2020-10-12,有3个新用户(id为2,3,1)登录
    2020-10-13,没有新用户登录
    2020-10-14,有1个新用户(id为4)登录
    2020-10-15,没有新用户登录

    select distinct date
    ,sum(case when (user_id,date) in 
    (select user_id,min(date)from login group by user_id)
    then 1 else 0 end)as new
    from login
    group by date
    order by date;

    先对id分组并选出最小的日期,就得到了所有用户最先登录的日期

    然后用sum+case when来计数,如果原表的id+date在(用户最先登录日期表)中,那么就+1,并赋值给new

    最后根据日期分组和排序即可

    现在有一个需求,让你统计正常用户发送给正常用户邮件失败的概率:
    有一个邮件(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(case type when 'completed' then 0 else 1 end)*1.0/count(type),3)as p
    from email
    where send_id in (select id from user where is_blacklist=0)
    and receive_id in (select id from user where is_blacklist=0)
    group by date
    order by date

  • 相关阅读:
    SpringMVC
    MyBatis 与 Spring 的完美整合方法
    持久层之 MyBatis: 第三篇 :缓存 And 高级查询
    持久层之 MyBatis: 第二篇 :动态SQL And多表查询
    C语言实现简单epoll服务器(二)
    C语言简单实现epoll服务器(一)
    shell编程题(十九)
    shell编程题(十七)
    shell编程题(十六)
    shell编程题(十三)
  • 原文地址:https://www.cnblogs.com/liuxiangyan/p/14378207.html
Copyright © 2011-2022 走看看