题解 | #根据指定记录是否存在输出不同情况#

根据指定记录是否存在输出不同情况

https://www.nowcoder.com/practice/f72d3fc27dc14f3aae76ee9823ccca6b

题目:请你筛选表中的数据,当有任意一个0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率(保留3位小数);若不存在这样的用户,则输出所有有作答记录的用户的这两个指标。结果按未完成率升序排序。

条件分解:

  • 任意一个0级用户未完成试卷数大于2时,输出每个0级用户的试卷未完成数和未完成率(保留3位小数)
  • 若不存在这样的用户,则输出所有有作答记录的用户的这两个指标
  • 按未完成率升序排序

思路:

第一步:算出所有用户的试卷未完成数和未完成率

        select
          uid,
          sum(if (submit_time is null, 1, 0)) incomplete_cnt,
          sum(if (submit_time is null, 1, 0)) / count(*) incomplete_rate
        from
          exam_record
        group by
          uid         

第二步:已用户表为主表,关联上面算出来的完成率,并开窗算出每个级别下最大的未完成数

第三步:拿出level=0的用户uid

	  select
        uid
      from
        user_info
      where
        level = 0

第四步:拿出有作答记录的用户uid

      select
        uid
      from
        exam_record
      group by
        uid

第五步:对任意一个0级用户未完成试卷数大于2进行判断,因为我们前面已经算出来每个等级对应未完成数的最大值,所以只要判断最大值是否大于2

if (
    (
      select
        max(max_incomplete_cnt)
      from
        complete_info
      where
        level = 0
    ) > 2

完整代码:

with
  complete_info as (
    select
      t1.uid,
      t1.level,
      coalesce(incomplete_cnt, 0) incomplete_cnt,
      round(coalesce(incomplete_rate, 0), 3) incomplete_rate,
      max(incomplete_cnt) over (
        partition by
          t1.level
      ) max_incomplete_cnt
    from
      user_info t1
      left join (
        select
          uid,
          sum(if (submit_time is null, 1, 0)) incomplete_cnt,
          sum(if (submit_time is null, 1, 0)) / count(*) incomplete_rate
        from
          exam_record
        group by
          uid
      ) t2 on t1.uid = t2.uid
  )
select
  uid,
  incomplete_cnt,
  incomplete_rate
from
  complete_info
where
  if (
    (
      select
        max(max_incomplete_cnt)
      from
        complete_info
      where
        level = 0
    ) > 2,
    uid in (
      select
        uid
      from
        user_info
      where
        level = 0
    ),
    uid in (
      select
        uid
      from
        exam_record
      group by
        uid
    )
  )
order by incomplete_rate asc

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务