题解 | #牛客每个人最近的登录日期(六)#
牛客每个人最近的登录日期(六)
https://www.nowcoder.com/practice/572a027e52804c058e1f8b0c5e8a65b4
#逆天的题目说明,搞几个序号很难?逆天的文字组织,真的是人? /*牛客每天有很多人登录,请你统计一下牛客每个用户刷题情况,包括: 用户的名字,以及截止到某天(他妈的这句话意思是有记录的每天都统计),累计总共通过了多少题。 说明: 1.不存在没有登录却刷题的情况, 2.存在登录了没刷题的情况,此情况不会存在刷题表里面, 3.存在提交代码没有通过的情况,此情况的通过数量将记录在刷题表里,对应的通过数量位0。 输出要求 包括: 1.用户的名字, 2.每个用户,每天都统计累计总共通过了多少题 3.有登录却没有刷题的天数的数据不需要输出 4.查询结果先按照日期升序排序,再按照姓名升序排序, */ /*select * from login l left join passing_number p on l.user_id=p.user_id and l.date=p.date left join user as u on l.user_id=u.id*/ #login和通过数目表按用户id和登陆日期,双绑定条件匹配好,user也匹配好 /*1.截止到某天,是按每一天计数 2.累计总共通过,累加 3.先用窗口处理累加,再用where或窗口row_number挑选用户对应的最大日期 最好用窗口,不会动原数据 */ /*select t1.name1 as u_n, t1.date1 as date, t1.ps_num as ps_num from (select l.user_id as user_id1 , l.date as date1, p.number as number1, u.name as name1 ,row_number()over(partition by l.user_id order by l.date desc) as t_rank ,sum(p.number)over(partition by l.user_id order by l.date asc) as ps_num from login l left join passing_number p on l.user_id=p.user_id and l.date=p.date left join user as u on l.user_id=u.id) as t1 where t1.t_rank=1*/ #这样写是截止到最后一天, select u.name as u_n ,l.date as date ,sum(p.number)over(partition by l.user_id order by l.date asc) as ps_num from login l left join passing_number p on l.user_id=p.user_id and l.date=p.date left join user as u on l.user_id=u.id #上面这样写,没满足“有登录没有刷题的那一天不需要输出” where p.number is not null order by date asc, u_n asc
