记录一下做题过程中出现的问题:
问题1:因为计算月份数和2021年活跃总天数时用到exam_record表中的start_time列和
practice_record表中的submit_time列,统计难度大。
解决方法:解决该问题的想法是分别在这两个表中筛选出新表,并给新表增加相同的列tag和
act_time,将start_time列和submit_time列的值放到act_time列下,然后tag列下存
放不同的值'exam'和'question'用于计算试卷作答总数和答题总次数。

问题2:根据例题,虽然用户1003的等级为7但是其并没有参与试卷作答和题目练习,采用
用户子查询(where ui IN (...))的方法得出的最后结果中出现报错,没有用户1003。
解决方法:user_info表和新表连接再按条件筛选。
SELECT u_i.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 u_i 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
) e_p USING(uid)
WHERE level BETWEEN 6 AND 7
GROUP BY u_i.uid
ORDER BY act_month_total DESC, act_days_2021 DESC