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

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

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

从这道题目本身看,难点不是很多,个人感觉最关键的就是如何理解未完成率较高的50%用户,这也卡了我蛮久。
通过观察发现,这个未完成率前50%的用户的计算就是先得到各个用户总的完成率然后进行排序,根据排名进行筛选,在这里我遇到了一个问题,如何对这前50%的用户进行筛选,一开始我用的是dense_rank()over()进行排序,然后想着算出总用户数num,取前一半也即round(num/2)个用户的数据,但这样行不通。
随后,参考了优秀解答发现排序函数中还有percent_rank()over()的用法,我也是第一次见这种用法,这样就直接得到了各个用户的完成情况在总体中的百分位,然后直接筛选即可。
select
  uid,
  start_month,
  count(start_time) total_cnt,
  count(submit_time) complete_time
from
  (
    select
      uid,
      date_format(start_time, '%Y%m') start_month,
      dense_rank() over(
        partition by uid
        order by
          date_format(start_time, '%Y%m') desc
      ) rk,
      start_time,
      submit_time
    from
      exam_record
    where
      uid in (select uid from  // 使用子查询查找未完成率较高的50%用户且等级为6、7级
          		(select uid,level,
              	percent_rank()over(order by incomplete_rate desc) rk
            from
              (
                select
                  er.uid uid,
                  level,
                  sum(isnull(submit_time)) / count(start_time) incomplete_rate
                from
                  exam_record as er
                  left join user_info as ui on er.uid = ui.uid
                  left join examination_info as ei on er.exam_id = ei.exam_id
                where
                  ei.tag = 'SQL'
                group by
                  er.uid
              ) a
          ) b
        where
          rk <= 0.5
          and level >= 6
      )
  ) c
where
  rk <= 3
group by
  uid,
  start_month
order by
  uid,
  start_month
全部评论

相关推荐

好消息是活的像个人了,周末可以约会吃饭打游戏了坏消息是钱没了,当初来小红书就是为了钱啊哭笑不得😭
犯困嫌疑人:好事儿啊,取消大小周能有更多自己的时间,周末还能约对象玩,这不美滋滋?
投递小红书等公司6个岗位 > 小红书取消大小周
点赞 评论 收藏
分享
谁知道呢_:要掉小珍珠了,库库学三年,这个结果
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务