此题坑点有两个:

1、原题要求的【当播放时长大于视频时长时,播放进度均记为100%】,是在计算【各类视频,每次播放进度】时需要进行的操作;

2、【计算各类视频的平均播放进度,将进度大于60%的类别输出】是针对最后的结果,即平均播放进度进行大于60%的筛选。

步骤拆解:

  1. 计算各类视频的所有播放进度play_duration;

  2. 计算play_progess, play_duration大于duration的全部处理为100。按tag聚合,计算avg_play_progess, 筛选>60的记录;

  3. 对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