SELECT
tag,
CONCAT(avg_play_progress, '%') AS avg_progress
FROM ( SELECT
tag,
ROUND(AVG(
IF(
TIMESTAMPDIFF(SECOND, start_time, end_time) > duration, 1,
TIMESTAMPDIFF(SECOND, start_time, end_time) / duration
)) * 100, 2) AS avg_play_progress
FROM tb_user_video_log
JOIN tb_video_info USING(video_id)
GROUP BY tag
)t1
WHERE t1.avg_play_progress > 60
ORDER BY avg_play_progress DESC
几个需要注意的点,一是计算时间秒差使用的函数TIMESTAMPDIFF(SECOND, start_time, end_time)。二是可能会有播放时间大于视频时长的情况出现,需使用IF函数进行处理。三是百分号只能通过CONCAT加上,但加上之后数据会变为字符串形式,无法判断>60这一条件,所以使用子查询进行判断,在主查询中再加上%。
感想是大厂的题不能怕麻烦 、、

京公网安备 11010502036488号