题解 | #平均播放进度大于60%的视频类别#
平均播放进度大于60%的视频类别
https://www.nowcoder.com/practice/c60242566ad94bc29959de0cdc6d95ef
select t2.tag, concat( round(avg(if( timestampdiff(second, t1.start_time, t1.end_time) > t2.duration, 1, timestampdiff(second, t1.start_time, t1.end_time) / t2.duration))* 100,2), '%') as avg_play_progress from tb_user_video_log as t1 join tb_video_info as t2 on t1.video_id=t2.video_id group by t2.tag having substring_index(avg_play_progress,'%',1)>60 order by avg_play_progress desc # 首先group by肯定是tag,因为要求各类视频的平均播放进度,所以要按照类聚类。 # 还要用到having,因为需要对分组聚合之后的内容进行条件过滤(进度大于60%)
解题思路:
- 首先看题目要求,要求”计算各类视频的平均播放进度,将进度大于60%的类别输出。",所以首先要对视频类别进行分组,对每个类别的播放进度进行聚合。
- "输出播放进度>60%的类别”,所以要对聚合之后的数进行筛选,用到having。(having的执行顺序在聚合函数之后)
- 这里要输出百分比,所以用到了concat(a,b)-->"ab"
- 在having的时候要进行筛选,所以要分离百分号和数字,用到substring_index(str,符号,第几位),以符号进行分割,返回分割后的第几位,相当于python里边的split函数,不过在mysql中,首位是1不是0。
- timestampdiff(type,start_time,end_time)函数返回以type位单位的start_time和end_time差。