题解 | #每个6/7级用户活跃情况#

每个6/7级用户活跃情况

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

这道题我一开始想的时候,不知道怎样才能够找出不重复的月份,天数。

参考了大神的解法。

在子查询中:

  1. 就是先对exam_record表和practice_record表进行时间选择,还有时间提取。在这一步当中保留year。
  2. 有一步做得十分巧妙,就是给新增加一个列叫做tag,用于外层查询中分别进行选择。

在外层查询中:

  1. 对用户条件进行筛选 level >=6
  2. 对时间进行进一步的筛选,选择2021年

需要注意的点到底用哪个时间:submit_time, start_time, 2021年对应的哪个,这点我开始觉得很乱,这也是做不出来的原因。

  1. 在exam_record表中,start_time是act_time活跃时间
  2. 但是在practice_record表中,submit_time是act_time活跃时间

在外层查询中,我们要针对act_time进行2021年的条件筛选。

select
    user_info.uid as uid,
    count(distinct act_month) as act_month_total,
    count(
        distinct case
            when year (act_time) = 2021 then act_day
        end
    ) as act_days_2021,
    count(
        distinct case
            when year (act_time) = 2021
            and tag = 'exam' then act_day
        end
    ) as act_days_2021_exam,
    count(
        distinct case
            when year (act_time) = 2021
            and tag = 'question' then act_day
        end
    ) as act_days_2021_question
from
    user_info
    left join (
        select
            uid,
            start_time as act_time,
            date_format (start_time, '%Y%M') as act_month,
            date_format (start_time, '%Y%M%D') as act_day,
            'exam' as tag
        from
            exam_record
        union all
        select
            uid,
            submit_time as act_time,
            date_format (submit_time, '%Y%M') as act_month,
            date_format (submit_time, '%Y%M%D') as act_day,
            'question' as tag
        from
            practice_record
    ) as act_info on user_info.uid = act_info.uid
where
    user_info.level >= 6
group by
    user_info.uid
order by
    act_month_total desc,
    act_days_2021 desc

全部评论

相关推荐

10-29 15:51
嘉应学院 Java
后端转测开第一人:你把简历的学历改成北京交通大学 去海投1000份发现基本还是没面试
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

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