此题坑点有两个:
1、原题要求的【当播放时长大于视频时长时,播放进度均记为100%】,是在计算【各类视频,每次播放进度】时需要进行的操作;
2、【计算各类视频的平均播放进度,将进度大于60%的类别输出】是针对最后的结果,即平均播放进度进行大于60%的筛选。
步骤拆解:
-
计算各类视频的所有播放进度play_duration;
-
计算play_progess, play_duration大于duration的全部处理为100。按tag聚合,计算avg_play_progess, 筛选>60的记录;
-
对avg_play_progess四舍五入到两位小数,最后添加百分号,并排序。
代码如下:
WITH t1 AS(
SELECT
tag,
video_id,
duration,
TIMESTAMPDIFF(second, start_time, end_time) play_duration
FROM tb_video_info
LEFT JOIN tb_user_video_log USING(video_id)
),
t2 AS(
SELECT
tag,
AVG(IF(play_duration > duration, 1, play_duration / duration) * 100) avg_play_progress
FROM t1
LEFT JOIN tb_user_video_log USING(video_id)
GROUP BY 1
HAVING avg_play_progress > 60
)
SELECT
tag,
CONCAT(ROUND(avg_play_progress, 2), '%') avg_play_progress
FROM t2
ORDER BY 2 desc