周报统计功能是在线直播网站源码最要的一部分,在线直播网站源码可以通过周报统计,查看每周的直播情况,接下来就让我们看看,怎么通过MySQL实现在线直播网站源码的统计功能。
1. 表设计
由于我这边数据量比较大,对在线直播网站源码的数据按用户分了100个区
2. 数据示例
3. 需求及数据说明
1、获取在线直播网站源码近20周的周报
2、在线直播网站源码周报结果包含直播观看时长live_watch_time, 回放观看时长playback_duration, 有效学习的课程(直播或回放观看超过50%)course_finish_total, 本周学习的课程总数course_total, 直播总数total, 观看直播的数量live_attendance, 直播有效观看的数量live_effective_attendance及直播总时长live_total_time
3、若观看直播则按直播开始时间start_time 进行分周, 若观看的是回放则按最后一次观看时间action_time进行分周
4、若当前周观看了其它周的直播, 不计在当前周的直播总数中, 但记在本周的学习课程数中
5、原始数据中若同一节课即观看了直播又观看了回放数据存放在一条记录中, 如何区分请查看status字段的说明(这样设计是为了便于统计学习的课程数, 因为在同一周中若即看了直播又看了回放只会算作学习了一节课)
4. sql实现
SELECT
start_time, SUBDATE(start_time, -6) AS end_time,
SUM(LEAST(watch_time, total_time)) AS live_watch_time,
SUM(current_position) AS playback_duration,
SUM(IF(status != 0 AND (watch_time / total_time > 0.5 OR current_position / total_length > 0.5), 1, 0)) AS course_finish_total,
SUM(IF(status != 0, 1, 0)) AS course_total,
SUM(IF(status != 2, 1, 0)) AS total,
SUM(IF(status IN (1, 3), 1, 0)) AS live_attendance,
SUM(IF(watch_time / total_time > 0.5, 1, 0)) AS live_effective_attendance,
SUM(total_time) AS live_total_time
FROM(
SELECT
IF(status IN (0, 1) OR type=2, start_time, start_time2) AS start_time,
IF(status=2 OR (status=3 AND type=1 AND start_time != start_time2), 0, watch_time) AS watch_time,
IF(status=2 OR (status=3 AND type=1 AND start_time != start_time2), 0, total_time) AS total_time,
IF(status=1 OR type=2, 0, current_position) AS current_position,
IF(status=1 OR type=2, 0, total_length) AS total_length,
IF(status=2 AND type=2, 0, status) AS status,
type
FROM(
SELECT
LEFT(SUBDATE(FROM_UNIXTIME(start_time),IF(FROM_UNIXTIME(start_time,'%w')=0, 7, FROM_UNIXTIME(start_time,'%w'))-1), 10) AS start_time,
LEFT(SUBDATE(action_time,IF(DATE_FORMAT(action_time,'%w')=0, 7, DATE_FORMAT(action_time,'%w'))-1), 10) AS start_time2,
watch_time, end_time - start_time AS total_time, current_position, total_length, status, type
FROM
`l_live_room`
LEFT JOIN
(SELECT 1 AS type UNION SELECT 2 AS type) AS a
ON (status IN (0, 1) AND type = 1) OR status IN (2, 3)
WHERE
sso_id = 123123
AND error != 1
AND GREATEST(FROM_UNIXTIME(start_time), action_time) >= SUBDATE(CURDATE(),IF(DATE_FORMAT(CURDATE(),'%w')=0, 7, DATE_FORMAT(CURDATE(),'%w'))-1+133)
) AS t
WHERE NOT (start_time = start_time2 AND type = 2)
) AS t
WHERE start_time >= SUBDATE(CURDATE(),IF(DATE_FORMAT(CURDATE(),'%w')=0, 7, DATE_FORMAT(CURDATE(),'%w'))-1+133)
AND start_time <= NOW()
GROUP BY start_time;

5. sql拆分解析
5.1 原始数据处理(子查询1)
5.2 过滤多余重复数据(子查询2)
5.3 生成报告
声明:本文由云豹科技转发自p1049990866博客,如有侵权请联系作者删除
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69982461/viewspace-2786473/
,如需转载,请注明出处,否则将追究法律责任。