题解 | #平均播放进度大于60%的视频类别#

平均播放进度大于60%的视频类别

http://www.nowcoder.com/practice/c60242566ad94bc29959de0cdc6d95ef

本题类型和之前类似,相比if函数我比较常用case when daydiff和timestampdiff 前者是日期差,后者是时间差更为灵活

 TIMESTAMPDIFF(day/hour/second....., '小时间', '大时间')

百分比的表示则先把avg*100 再用concat和%链接即可 因为是计算出答案后在对答案进行筛选 所以用having

select tag,concat(round(avg(case when TIMESTAMPDIFF(second, start_time, end_time)<=duration
                   then TIMESTAMPDIFF(second, start_time, end_time)/duration
               else 1 end)*100,2),'%') as AVG_play_progress
from tb_user_video_log vid
    join tb_video_info info
    on vid.video_id=info.video_id

group by tag
having SUBSTRING_INDEX(AVG_play_progress,"%",1)>60
order by AVG_play_progress desc
              
全部评论
我记得having子句是先于select子句执行,那此时having里面的AVG_play_progress应该还没有产生的吧。麻烦指导下,谢谢。
6 回复 分享
发布于 2022-03-08 10:25
有个小问题,这里timestampdiff(second,start_time,end_time)可以,但是为什么不能向上一题一样直接用end_time-start_time呢,我尝试后发现这两个计算结果是不一样,但是为什么会不一样呢,
5 回复 分享
发布于 2022-01-16 14:38
select b.tag, concat(round(avg(if(timestampdiff(second,a.start_time,a.end_time)>b.duration,1,timestampdiff(second,a.start_time,a.end_time)/b.duration))*100,2),'%') avg_play_progress from tb_user_video_log a join tb_video_info b using(video_id) group by b.tag having avg_play_progress > '60.00%' order by avg_play_progress desc 我偷懒直接都没用substring_index分割哈哈哈
1 回复 分享
发布于 2023-01-07 13:14 四川
nice!
点赞 回复 分享
发布于 2021-12-03 15:53
好清晰的答案,我写了一大堆,学习了!
点赞 回复 分享
发布于 2022-09-16 04:24 河北
想请问一下为什么用avg呀
点赞 回复 分享
发布于 2023-02-16 23:41 广东

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
评论
64
9
分享
牛客网
牛客企业服务