题解 | #未完成率较高的50%用户近三个月答卷情况#

未完成率较高的50%用户近三个月答卷情况

https://www.nowcoder.com/practice/3e598a2dcd854db8b1a3c48e5904fe1c

# 先找到sql试卷未完成率较高的前一半用户,筛选出level是6、7的
# 这些用户的有作答记录的近三个月,分组统计每月的答卷数和完成数

WITH temp AS
    ( # 联结表
    SELECT a.uid, c.start_time, c.score, a.level, b.tag
    FROM exam_record c
        LEFT JOIN user_info a USING(uid)
        LEFT JOIN examination_info b USING(exam_id)
    # WHERE b.tag = 'SQL' #AND a.level IN (6,7)
    ),
    # 找到较高的50%的用户,还是要排序在前50%
    50_temp AS
    (
    SELECT uid, ROUND(SUM(IF(score IS NULL, 1, 0))/COUNT(start_time), 4) incomplete_rate
    FROM temp
    WHERE tag = 'SQL'
    GROUP BY uid
    ),
    u_temp AS
    (
    SELECT uid, PERCENT_RANK() OVER(ORDER BY incomplete_rate) rate_rank
    FROM 50_temp
    )




SELECT uid, DATE_FORMAT(start_time, "%Y%m") start_month,
        COUNT(start_time) total_cnt, 
        COUNT(score) complete_cnt
FROM (
    SELECT uid, start_time, score, DENSE_RANK() OVER(PARTITION BY uid ORDER BY DATE_FORMAT(start_time, "%Y%m") DESC) rank_month # 按时间对记录排序
    FROM temp
    WHERE uid IN ( # uid的确定
        SELECT uid 
        FROM u_temp
        WHERE rate_rank >= 0.5 # 未完成率在前50%
        ) AND level IN (6,7)
    ) b
WHERE rank_month < 4 # 近三个月限定
GROUP BY uid, start_month # 按照这两个字段分组
ORDER BY uid, start_month

题目拆解:1.SQL试卷上未完成率较高的50%用户中——限定了用户范围,是在sql上未完成率排序前50%的用户(最开始看示例,我还以为是未完成率高于50%的人)

2.6级和7级用户在有试卷作答记录的近三个月中,每个月的答卷数目和完成数目——跟上一题相似

新知识点:

1.percent_rank() over() 按照数字所在的位置进行百分位分段

2.ntile(n)over() 将数字按照大小平均分成n段

3.在标准的SQL中,一个查询只能有一个WITH子句,但是可以在单个WITH子句中定义多个公用表表达式(CTE)。每个CTE之间用逗号分隔。

4.dense_rank() over() 1 2 2 3 3 4 (不跳过排名,可以理解为对类别进行计数)

踩的坑:

1.看示例以为是按未完成率的大小筛选,但是根据题意还是要排序

2.题意是限制了用户范围,但是没有限制作答记录的题目类型,最开始我给限制了,老是少一条记录

思路:

1.主查询用来查询结果示例的三个字段。需要满足的条件是用户是在一定范围内的;用户等级是由限制的;作答记录的日期是由限制的

2.根据上述限制,我们要先把用户,特别是SQL试卷上未完成率较高的50%用户中 找出来,然后再同时找到符合等级的用户。

3.用户确定了,再找到每个用户近三个月的作答记录,再统计总作答和实际完成数,最后排序。

做法:

1.将三个表有用的字段联结起来,内联结或左连接都可以,创建了第一个临时表

2.SQL试卷上未完成率较高的50%用户中 :根据SQL题初步筛选用户,并且计算未完成率,使用if函数,创建第二个临时表;创建第三个,来对未完成率进行百分比排序,使用pertcent_rank,我先使用正序排列未完成率,这个时候未完成率小的排前面的,所以在主查询采用>=

3.主查询将其组配起来

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务