主要信息

  • 课程表course_tb如下(其中course_id代表课程编号,course_name表示课程名称);行为表behavior_tb如下(其中user_id表示用户编号、if_sign表示是否报名、course_id代表课程编号);上课情况表attend_tb如下(其中user_id表示用户编号、course_id代表课程编号、in_datetime表示进入直播间的时间、out_datetime表示离开直播间的时间)
  • 请你统计每个科目的出勤率(attend_rate(%),结果保留两位小数),出勤率=出勤(在线时长10分钟及以上)人数 / 报名人数,输出结果按course_id升序排序,以上数据的输出结果如下: ​

问题拆解

总体思路

  • 出勤率=出勤(在线时长10分钟及以上)人数 / 报名人数

具体实现

  • 需要返回course_name,故需要通过course_id连接course_tb和behavior_tb,取出course_name
  • 出勤(在线时长10分钟及以上)人数 = 去重用户数,过滤出符合在线时长的人数(使用UNIX_TIMESTAMP转化out_datetime、in_datetime作差后的分钟数>=10min)
  • 报名人数 = if_sign为1的去重用户数
  • 返回course_id、course_name、出勤人数/报名人数 * 100 最后取两位有效数字

考点:子查询、join、order by、时间函数的使用UNIX_TIMESTAMP

SELECT course_id, course_name
	, round(attend_num / sign_num * 100, 2) AS "attend_rate(%)"
FROM (
	SELECT course_id, count(DISTINCT user_id) AS attend_num
	FROM attend_tb
	WHERE (UNIX_TIMESTAMP(out_datetime) - UNIX_TIMESTAMP(in_datetime)) / 60 >= 10
	GROUP BY course_id
) t1
	LEFT JOIN (
		SELECT course_id, count(DISTINCT user_id) AS sign_num
		FROM behavior_tb
		WHERE if_sign = 1
		GROUP BY course_id
	) t2 USING (course_id)
	LEFT JOIN course_tb USING (course_id)
ORDER BY course_id;