• t2计算报名人数时,需要注意计算的是所有报名人数,而不是有观看记录的报名人数,因此如果与t1不变,仍使用多余的JOIN会导致剔除无记录的人数,从而导致结果出现误差
  • 即无使用没有意义的JOIN,每个表干自己表的活
WITH t1 AS(
    SELECT at.course_id, course_name
            ,COUNT(DISTINCT user_id) AS num
    FROM attend_tb at
    LEFT JOIN course_tb USING(course_id)
    WHERE  TIMESTAMPDIFF(minute, in_datetime, out_datetime) >= 10
    GROUP BY at.course_id, course_name
), t2 AS(
    SELECT course_id
            ,COUNT(DISTINCT user_id) AS total_num
    FROM behavior_tb
    WHERE if_sign = 1
    GROUP BY course_id
)

SELECT t1.course_id, t1.course_name
        ,ROUND(100*num/total_num, 2) AS attend_rate
FROM t1
JOIN t2 USING(course_id)