赞
踩
各个视频的平均完播率
1、视频信息表
ID | AuthorName | Category | Age | Start Time |
---|---|---|---|---|
1 | 张三 | 影视 | 30 | 2024-01-01 7:00:00 |
2 | 李四 | 美食 | 60 | 2024-01-01 7:00:00 |
3 | 王麻子 | 旅游 | 90 | 2024-01-01 7:00:00 |
(video_id-视频ID, AuthorName-创作者, tag-类别标签, duration-视频时长(秒), release_time-发布时间)
2、视频互动表
ID | Group | Start Time | End Time | Status | Flag1 | Flag2 | Value |
---|---|---|---|---|---|---|---|
1 | 1 | 2024-06-01 10:00:00 | 2024-06-01 10:00:30 | 0 | 1 | 1 | null |
2 | 1 | 2024-06-01 10:00:00 | 2024-06-01 10:00:24 | 0 | 0 | 1 | null |
3 | 1 | 2024-06-01 11:00:00 | 2024-06-01 11:00:34 | 0 | 1 | 0 | 1 |
1 | 2 | 2024-09-01 10:00:00 | 2024-09-01 10:00:42 | 1 | 0 | 1 | null |
2 | 2 | 2024-06-01 11:00:00 | 2024-06-01 11:00:30 | 1 | 0 | 1 | null |
3 | 1 | 2024-06-01 12:00:00 | 2024-06-01 11:00:34 | 0 | 1 | 0 | 1 |
(uid-用户ID, video_id-视频ID, start_time-开始观看时间, end_time-结束观看时间, if_follow-是否关注, if_like-是否点赞, if_retweet-是否转发, comment_id-评论ID)
问题:计算2024年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序
注:视频完播率是指完成播放次数占总播放次数的比例。简单起见,结束观看时间与开始播放时间的差>=视频时长时,视为完成播放。
SQL实现过程:
1、创建表和插入数据
CREATE TABLE dy_video_info ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID', video_id INT UNIQUE NOT NULL COMMENT '视频ID', authorname VARCHAR(16) NOT NULL COMMENT '创作者ID', tag VARCHAR(16) NOT NULL COMMENT '类别标签', duration INT NOT NULL COMMENT '视频时长(秒数)', release_time datetime NOT NULL COMMENT '发布时间' )CHARACTER SET utf8 COLLATE utf8mb3_general_ci; INSERT INTO dy_video_info(video_id, authorname, tag, duration, release_time) VALUES (1, '张三', '影视', 31, '2024-01-01 7:00:00'), (2, '李四', '美食', 65, '2024-01-01 7:00:00'), (3, '王麻子', '搞笑', 90, '2024-01-01 7:00:00'); CREATE TABLE dy_user_video_log ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID', uid INT NOT NULL COMMENT '用户ID', video_id INT NOT NULL COMMENT '视频ID', start_time datetime COMMENT '开始观看时间', end_time datetime COMMENT '结束观看时间', if_follow TINYINT COMMENT '是否关注', if_like TINYINT COMMENT '是否点赞', if_retweet TINYINT COMMENT '是否转发', comment_id INT COMMENT '评论ID' ) CHARACTER SET utf8 COLLATE utf8mb3_general_ci; INSERT INTO dy_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id) VALUES (1, 1, '2024-06-01 10:00:00', '2024-06-01 10:00:30', 0, 1, 1, null), (2, 1, '2024-06-01 10:00:00', '2024-06-01 10:00:24', 0, 0, 1, null), (3, 3, '2024-06-01 11:00:00', '2024-06-01 11:00:34', 0, 1, 0, 1), (1, 2, '2024-09-01 10:00:00', '2024-09-01 10:00:42', 1, 0, 1, null), (2, 2, '2024-06-01 11:00:00', '2024-06-01 11:00:30', 1, 0, 1, null), (3, 3, '2024-06-01 11:00:00', '2024-06-01 11:00:34', 0, 1, 0, 1);
a、先分析:
b、计算结束时间和开始时间的差值:
SELECT video_id ,
end_time - start_time as avg_comp_play_rate
FROM dy_user_video_log ORDER BY video_id
c、加入结束时间减开始时间大于30的记为1,其他的记为0
SELECT
video_id,
avg_comp_play_rate,
IF(avg_comp_play_rate > 30, 1, 0) AS play_rate_result
FROM
(
SELECT
video_id,
(end_time - start_time) as avg_comp_play_rate
FROM
dy_user_video_log
) AS derived_table_name;
2、SQL实现效果
-- 选择视频ID和计算平均完成播放率 SELECT a.video_id, -- 选择视频的ID -- 计算平均完成播放率,四舍五入到小数点后三位 round( -- 使用条件求和和计数函数计算完成播放率 sum( if( -- 如果视频的结束时间减去开始时间大于等于视频的时长,则认为是完成播放 end_time - start_time >= duration, 1, -- 完成播放记为1 0 -- 否则记为0 ) ) / -- 将完成播放的个数除以总播放次数 count(start_time), -- 计算总播放次数 3 -- 四舍五入到小数点后三位 ) as avg_comp_play_rate -- 将计算结果命名为avg_comp_play_rate FROM dy_user_video_log a -- 从dy_user_video_log表中选择数据,别名为a -- 左连接dy_video_info表,别名为b,根据视频ID匹配 LEFT JOIN dy_video_info b on a.video_id = b.video_id WHERE year(start_time) = 2024 -- 筛选出开始时间年份为2024的记录 GROUP BY a.video_id -- 根据视频ID分组 ORDER BY avg_comp_play_rate DESC; -- 按平均完成播放率降序排列
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。