一、明确需求:
输出平均播放进度>60%的类别
二、需求分解
根据题例可知,计算互动表video_log每条记录的观看时长,联结信息表video_info获得每条记录对应的tag视频类别。
三、实现代码
with
#对互动表和信息表进行去重处理
a as
(select distinct * from tb_user_video_log)
, b as
(select distinct * from tb_video_info)
# 此处唯一要注意的是观看时间的计算要用时间函数timestampdiff,不能(end_time-start_time)直接相减
select tag
,concat(round((sum(play_progress)/count(distinct uid)) *100,2),'%') avg_play_progress
from
(select a.uid,b.tag
,if(timestampdiff(second,a.start_time,a.end_time) > b.duration,1
, timestampdiff(second,a.start_time,a.end_time) / b.duration) play_progress
from a left join b on a.video_id = b.video_id
)x
group by tag
having avg(play_progress) > 0.6
order by avg_play_progress desc
四、拓展知识
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
- unit:year,month,day,week,hour,minute,second
- datetime_expr1:start_time
- datetime_expr2:endtime 链接官方文档
- 时间格式datetime之间相减的是类似个十百千格式的个数相减,不会进行分秒的换算。