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

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

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

select
  a.uid,
  a.start_month,
  count(start_month) as total_cnt,
  count(score) as complete_cnt
from
  (
    select
      a.uid,
      date_format(er.start_time, '%Y%m') as start_month,
      er.score,
      dense_rank() over(
        partition by a.uid
        order by
          date_format(er.start_time, '%Y%m') desc
      ) as ranking2
    from
      (
        select
          *
        from
          (
            select
              er.uid,
              percent_rank() over(
                partition by ei.tag
                order by
                  1 - count(er.score) / count(er.start_time)
              ) as ranking
            from
              examination_info ei
              left join exam_record er on ei.exam_id = er.exam_id
            where
              ei.tag = 'SQL'
            group by
              er.uid
          ) a
        where
          a.uid in (
            select
              ui.uid
            from
              user_info ui
            where
              ui.level in('6', '7')
          )
          and ranking >= 0.5
      ) a
      left join exam_record er on er.uid = a.uid
  ) a
where
  ranking2 <= 3
group by
  uid,
  start_month
order by
  a.uid asc,
  a.start_month asc
解释几个关键点:
1、percent_rank——以试卷'tag'开窗,用未完成率'1-完成率'排序
percent_rank() over(
                partition by ei.tag
                order by
                  1 - count(er.score) / count(er.start_time)
              ) as ranking
2、求最近有过答题的三个月,因为每位用户每个月可能有n次答题,所以使用dense_rank(通俗点儿讲就是dense_rank密集排序,遇到多个相同月份时会出现1111122223344444...,外面套一层取rank<=3即可取出该用户近三月内所有答题记录)
dense_rank() over(
        partition by a.uid
        order by
          date_format(er.start_time, '%Y%m') desc
      ) 


#牛客专项练习#
全部评论

相关推荐

12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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