- 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)