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这一条件,所以使用子查询进行判断,在主查询中再加上%。

感想是大厂的题不能怕麻烦 、、