0


【牛客刷题-SQL大厂面试真题】NO1.某音短视频

在这里插入图片描述
体系化学习SQL,请到牛客经典高频面试题库,参加实训,提高你的SQL技能吧~

https://www.nowcoder.com/link/pc_csdncpt_itbd_sql

文章目录

前言

SQL每个人都要用,但是用来衡量产出的并不是SQL本身,你需要用这个工具,去创造其它的价值。

在这里插入图片描述

🐴 SQL1 各个视频的平均完播率

🚀 建表语句

DROPTABLEIFEXISTS tb_user_video_log, tb_video_info;CREATETABLE tb_user_video_log (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    uid INTNOTNULLCOMMENT'用户ID',
    video_id INTNOTNULLCOMMENT'视频ID',
    start_time datetimeCOMMENT'开始观看时间',
    end_time datetimeCOMMENT'结束观看时间',
    if_follow TINYINTCOMMENT'是否关注',
    if_like TINYINTCOMMENT'是否点赞',
    if_retweet TINYINTCOMMENT'是否转发',
    comment_id INTCOMMENT'评论ID')CHARACTERSET utf8 COLLATE utf8_bin;CREATETABLE tb_video_info (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    video_id INTUNIQUENOTNULLCOMMENT'视频ID',
    author INTNOTNULLCOMMENT'创作者ID',
    tag VARCHAR(16)NOTNULLCOMMENT'类别标签',
    duration INTNOTNULLCOMMENT'视频时长(秒数)',
    release_time datetimeNOTNULLCOMMENT'发布时间')CHARACTERSET utf8 COLLATE utf8_bin;INSERTINTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id)VALUES(101,2001,'2021-10-01 10:00:00','2021-10-01 10:00:30',0,1,1,null),(102,2001,'2021-10-01 10:00:00','2021-10-01 10:00:24',0,0,1,null),(103,2001,'2021-10-01 11:00:00','2021-10-01 11:00:34',0,1,0,1732526),(101,2002,'2021-09-01 10:00:00','2021-09-01 10:00:42',1,0,1,null),(102,2002,'2021-10-01 11:00:00','2021-10-01 11:00:30',1,0,1,null);INSERTINTO tb_video_info(video_id, author, tag, duration, release_time)VALUES(2001,901,'影视',30,'2021-01-01 7:00:00'),(2002,901,'美食',60,'2021-01-01 7:00:00'),(2003,902,'旅游',90,'2021-01-01 7:00:00');

📖 需求

问题:计算2021年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序
注:视频完播率是指完成播放次数占总播放次数的比例。简单起见,
结束观看时间与开始播放时间的差>=视频时长时,视为完成播放。

🍌🍌 答案

select a.video_id,round(sum(casewhen timestampdiff(second,b.start_time,b.end_time)>=a.duration 
          then1else0end)/count(b.uid),3)as avg_com_play_rate
from tb_video_info a join tb_user_video_log b on a.video_id=b.video_id
whereYEAR(b.start_time)=2021groupby a.video_id
orderby avg_com_play_rate desc

在这里插入图片描述

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

🚀 建表语句

DROPTABLEIFEXISTS tb_user_video_log, tb_video_info;CREATETABLE tb_user_video_log (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    uid INTNOTNULLCOMMENT'用户ID',
    video_id INTNOTNULLCOMMENT'视频ID',
    start_time datetimeCOMMENT'开始观看时间',
    end_time datetimeCOMMENT'结束观看时间',
    if_follow TINYINTCOMMENT'是否关注',
    if_like TINYINTCOMMENT'是否点赞',
    if_retweet TINYINTCOMMENT'是否转发',
    comment_id INTCOMMENT'评论ID')CHARACTERSET utf8 COLLATE utf8_bin;CREATETABLE tb_video_info (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    video_id INTUNIQUENOTNULLCOMMENT'视频ID',
    author INTNOTNULLCOMMENT'创作者ID',
    tag VARCHAR(16)NOTNULLCOMMENT'类别标签',
    duration INTNOTNULLCOMMENT'视频时长(秒数)',
    release_time datetimeNOTNULLCOMMENT'发布时间')CHARACTERSET utf8 COLLATE utf8_bin;INSERTINTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id)VALUES(101,2001,'2021-10-01 10:00:00','2021-10-01 10:00:30',0,1,1,null),(102,2001,'2021-10-01 10:00:00','2021-10-01 10:00:21',0,0,1,null),(103,2001,'2021-10-01 11:00:50','2021-10-01 11:01:20',0,1,0,1732526),(102,2002,'2021-10-01 11:00:00','2021-10-01 11:00:30',1,0,1,null),(103,2002,'2021-10-01 10:59:05','2021-10-01 11:00:05',1,0,1,null);INSERTINTO tb_video_info(video_id, author, tag, duration, release_time)VALUES(2001,901,'影视',30,'2021-01-01 7:00:00'),(2002,901,'美食',60,'2021-01-01 7:00:00'),(2003,902,'旅游',90,'2020-01-01 7:00:00');

📖 需求

问题:计算各类视频的平均播放进度,将进度大于60%的类别输出。
注:
播放进度=播放时长÷视频时长*100%,当播放时长大于视频时长时,播放进度均记为100%。
结果保留两位小数,并按播放进度倒序排序。

🍌🍌 答案

select
tag,
concat(ROUND(avg(if(
                timestampdiff(second,start_time,end_time)>=duration,1,timestampdiff(second,start_time,end_time)/duration
               ))*100,2),'%') avg_play_progress
from 
tb_user_video_log a join tb_video_info b
on a.video_id=b.video_id
groupby b.tag
havingavg(if(
                timestampdiff(second,start_time,end_time)>=duration,1,timestampdiff(second,start_time,end_time)/duration
               ))>0.6orderby avg_play_progress desc

在这里插入图片描述

🐴 SQL3 每类视频近一个月的转发量/率

🚀 建表语句

DROPTABLEIFEXISTS tb_user_video_log, tb_video_info;CREATETABLE tb_user_video_log (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    uid INTNOTNULLCOMMENT'用户ID',
    video_id INTNOTNULLCOMMENT'视频ID',
    start_time datetimeCOMMENT'开始观看时间',
    end_time datetimeCOMMENT'结束观看时间',
    if_follow TINYINTCOMMENT'是否关注',
    if_like TINYINTCOMMENT'是否点赞',
    if_retweet TINYINTCOMMENT'是否转发',
    comment_id INTCOMMENT'评论ID')CHARACTERSET utf8 COLLATE utf8_bin;CREATETABLE tb_video_info (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    video_id INTUNIQUENOTNULLCOMMENT'视频ID',
    author INTNOTNULLCOMMENT'创作者ID',
    tag VARCHAR(16)NOTNULLCOMMENT'类别标签',
    duration INTNOTNULLCOMMENT'视频时长(秒数)',
    release_time datetimeNOTNULLCOMMENT'发布时间')CHARACTERSET utf8 COLLATE utf8_bin;INSERTINTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id)VALUES(101,2001,'2021-10-01 10:00:00','2021-10-01 10:00:20',0,1,1,null),(102,2001,'2021-10-01 10:00:00','2021-10-01 10:00:15',0,0,1,null),(103,2001,'2021-10-01 11:00:50','2021-10-01 11:01:15',0,1,0,1732526),(102,2002,'2021-09-10 11:00:00','2021-09-10 11:00:30',1,0,1,null),(103,2002,'2021-10-01 10:59:05','2021-10-01 11:00:05',1,0,0,null);INSERTINTO tb_video_info(video_id, author, tag, duration, release_time)VALUES(2001,901,'影视',30,'2021-01-01 7:00:00'),(2002,901,'美食',60,'2021-01-01 7:00:00'),(2003,902,'旅游',90,'2020-01-01 7:00:00');

📖 需求

问题:统计在有用户互动的最近一个月(按包含当天在内的近30天算,
比如10月31日的近30天为10.2~10.31之间的数据)中,每类视频的转发量和转发率(保留3位小数)。
注:转发率=转发量÷播放量。结果按转发率降序排序。

🍌🍌 答案

select b.tag,sum(if_retweet) retweet_cnt,round(sum(if_retweet)/count(1),3) retweet_rate from
tb_user_video_log a
leftjoin  tb_video_info b
on a.video_id = b.video_id
where DATEDIFF(DATE((selectmax(start_time)from tb_user_video_log)),DATE(start_time))<=29groupby b.tag
orderby2desc

在这里插入图片描述

🐴 SQL4 每个创作者每月的涨粉率及截止当前的总粉丝量

🚀 建表语句

DROPTABLEIFEXISTS tb_user_video_log, tb_video_info;CREATETABLE tb_user_video_log (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    uid INTNOTNULLCOMMENT'用户ID',
    video_id INTNOTNULLCOMMENT'视频ID',
    start_time datetimeCOMMENT'开始观看时间',
    end_time datetimeCOMMENT'结束观看时间',
    if_follow TINYINTCOMMENT'是否关注',
    if_like TINYINTCOMMENT'是否点赞',
    if_retweet TINYINTCOMMENT'是否转发',
    comment_id INTCOMMENT'评论ID')CHARACTERSET utf8 COLLATE utf8_bin;CREATETABLE tb_video_info (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    video_id INTUNIQUENOTNULLCOMMENT'视频ID',
    author INTNOTNULLCOMMENT'创作者ID',
    tag VARCHAR(16)NOTNULLCOMMENT'类别标签',
    duration INTNOTNULLCOMMENT'视频时长(秒数)',
    release_time datetimeNOTNULLCOMMENT'发布时间')CHARACTERSET utf8 COLLATE utf8_bin;INSERTINTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id)VALUES(101,2001,'2021-09-01 10:00:00','2021-09-01 10:00:20',0,1,1,null),(105,2002,'2021-09-10 11:00:00','2021-09-10 11:00:30',1,0,1,null),(101,2001,'2021-10-01 10:00:00','2021-10-01 10:00:20',1,1,1,null),(102,2001,'2021-10-01 10:00:00','2021-10-01 10:00:15',0,0,1,null),(103,2001,'2021-10-01 11:00:50','2021-10-01 11:01:15',1,1,0,1732526),(106,2002,'2021-10-01 10:59:05','2021-10-01 11:00:05',2,0,0,null);INSERTINTO tb_video_info(video_id, author, tag, duration, release_time)VALUES(2001,901,'影视',30,'2021-01-01 7:00:00'),(2002,901,'影视',60,'2021-01-01 7:00:00'),(2003,902,'旅游',90,'2020-01-01 7:00:00'),(2004,902,'美女',90,'2020-01-01 8:00:00');

📖 需求

问题:计算2021年里每个创作者每月的涨粉率及截止当月的总粉丝量
注:
涨粉率=(加粉量 - 掉粉量)/ 播放量。结果按创作者ID、总粉丝量升序排序。
if_follow-是否关注为1表示用户观看视频中关注了视频创作者,
为0表示此次互动前后关注状态未发生变化,为2表示本次观看过程中取消了关注。

🍌🍌 答案

SELECT B.AUTHOR AS AUTHOR,DATE_FORMAT(A.start_time,'%Y-%m')ASMONTH,ROUND((COUNT(CASEWHEN A.if_follow=1THEN1END)-COUNT(CASEWHEN A.if_follow=2THEN1END))/COUNT(1),3)AS FANS_GROWTH_RATE,sum(sum(casewhen A.if_follow =1then1when A.if_follow =2then-1else0end))over(partitionby B.author 
                             orderby date_format(A.start_time,'%Y-%m')) 
                             fans_total
FROM tb_user_video_log A 
LEFTJOIN tb_video_info B 
ON A.VIDEO_ID=B.video_id
WHEREyear(A.start_time)=2021andyear(A.end_time)=2021GROUPBY B.AUTHOR,DATE_FORMAT(A.start_time,'%Y-%m')ORDERBY AUTHOR,fans_total

在这里插入图片描述

🐴 SQL5 国庆期间每类视频点赞量和转发量

🚀 建表语句

DROPTABLEIFEXISTS tb_user_video_log, tb_video_info;CREATETABLE tb_user_video_log (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    uid INTNOTNULLCOMMENT'用户ID',
    video_id INTNOTNULLCOMMENT'视频ID',
    start_time datetimeCOMMENT'开始观看时间',
    end_time datetimeCOMMENT'结束观看时间',
    if_follow TINYINTCOMMENT'是否关注',
    if_like TINYINTCOMMENT'是否点赞',
    if_retweet TINYINTCOMMENT'是否转发',
    comment_id INTCOMMENT'评论ID')CHARACTERSET utf8 COLLATE utf8_bin;CREATETABLE tb_video_info (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    video_id INTUNIQUENOTNULLCOMMENT'视频ID',
    author INTNOTNULLCOMMENT'创作者ID',
    tag VARCHAR(16)NOTNULLCOMMENT'类别标签',
    duration INTNOTNULLCOMMENT'视频时长(秒数)',
    release_time datetimeNOTNULLCOMMENT'发布时间')CHARACTERSET utf8 COLLATE utf8_bin;INSERTINTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id)VALUES(101,2001,'2021-09-24 10:00:00','2021-09-24 10:00:20',1,1,0,null),(105,2002,'2021-09-25 11:00:00','2021-09-25 11:00:30',0,0,1,null),(102,2002,'2021-09-25 11:00:00','2021-09-25 11:00:30',1,1,1,null),(101,2002,'2021-09-26 11:00:00','2021-09-26 11:00:30',1,0,1,null),(101,2002,'2021-09-27 11:00:00','2021-09-27 11:00:30',1,1,0,null),(102,2002,'2021-09-28 11:00:00','2021-09-28 11:00:30',1,0,1,null),(103,2002,'2021-09-29 11:00:00','2021-09-29 11:00:30',1,0,1,null),(102,2002,'2021-09-30 11:00:00','2021-09-30 11:00:30',1,1,1,null),(101,2001,'2021-10-01 10:00:00','2021-10-01 10:00:20',1,1,0,null),(102,2001,'2021-10-01 10:00:00','2021-10-01 10:00:15',0,0,1,null),(103,2001,'2021-10-01 11:00:50','2021-10-01 11:01:15',1,1,0,1732526),(106,2002,'2021-10-02 10:59:05','2021-10-02 11:00:05',2,0,1,null),(107,2002,'2021-10-02 10:59:05','2021-10-02 11:00:05',1,0,1,null),(108,2002,'2021-10-02 10:59:05','2021-10-02 11:00:05',1,1,1,null),(109,2002,'2021-10-03 10:59:05','2021-10-03 11:00:05',0,1,0,null);INSERTINTO tb_video_info(video_id, author, tag, duration, release_time)VALUES(2001,901,'旅游',30,'2020-01-01 7:00:00'),(2002,901,'旅游',60,'2021-01-01 7:00:00'),(2003,902,'影视',90,'2020-01-01 7:00:00'),(2004,902,'美女',90,'2020-01-01 8:00:00');

📖 需求

问题:统计2021年国庆头3天每类视频每天的近一周总点赞量和一周内最大单天转发量,
结果按视频类别降序、日期升序排序。假设数据库中数据足够多,
至少每个类别下国庆头3天及之前一周的每天都有播放记录。

🍌🍌 答案

select t1.tag,t1.day,sum(t2.likes),max(t2.retweet)FROM(select t2.tag ,left(t1.start_time,10)day,sum(t1.if_like)as likes,sum(t1.if_retweet)as retweet
from tb_user_video_log t1 leftjoin 
tb_video_info t2
on t1.video_id=t2.video_id
groupby t2.tag,day) t1
leftjoin(select t2.tag ,left(t1.start_time,10)day,sum(t1.if_like)as likes,sum(t1.if_retweet)as retweet
from tb_user_video_log t1 leftjoin 
tb_video_info t2
on t1.video_id=t2.video_id
groupby t2.tag,day) t2
on t1.tag=t2.tag
where TIMESTAMPDIFF(day,t2.day,t1.day)<7and TIMESTAMPDIFF(day,t2.day,t1.day)>=0and t1.dayin("2021-10-01","2021-10-02","2021-10-03")groupby t1.tag,t1.day

在这里插入图片描述

🐴 SQL6 近一个月发布的视频中热度最高的top3视频

🚀 建表语句

DROPTABLEIFEXISTS tb_user_video_log, tb_video_info;CREATETABLE tb_user_video_log (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    uid INTNOTNULLCOMMENT'用户ID',
    video_id INTNOTNULLCOMMENT'视频ID',
    start_time datetimeCOMMENT'开始观看时间',
    end_time datetimeCOMMENT'结束观看时间',
    if_follow TINYINTCOMMENT'是否关注',
    if_like TINYINTCOMMENT'是否点赞',
    if_retweet TINYINTCOMMENT'是否转发',
    comment_id INTCOMMENT'评论ID')CHARACTERSET utf8 COLLATE utf8_bin;CREATETABLE tb_video_info (
    id INTPRIMARYKEYAUTO_INCREMENTCOMMENT'自增ID',
    video_id INTUNIQUENOTNULLCOMMENT'视频ID',
    author INTNOTNULLCOMMENT'创作者ID',
    tag VARCHAR(16)NOTNULLCOMMENT'类别标签',
    duration INTNOTNULLCOMMENT'视频时长(秒数)',
    release_time datetimeNOTNULLCOMMENT'发布时间')CHARACTERSET utf8 COLLATE utf8_bin;INSERTINTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id)VALUES(101,2001,'2021-09-24 10:00:00','2021-09-24 10:00:30',1,1,1,null),(101,2001,'2021-10-01 10:00:00','2021-10-01 10:00:31',1,1,0,null),(102,2001,'2021-10-01 10:00:00','2021-10-01 10:00:35',0,0,1,null),(103,2001,'2021-10-03 11:00:50','2021-10-03 11:01:35',1,1,0,1732526),(106,2002,'2021-10-02 10:59:05','2021-10-02 11:00:04',2,0,1,null),(107,2002,'2021-10-02 10:59:05','2021-10-02 11:00:06',1,0,0,null),(108,2002,'2021-10-02 10:59:05','2021-10-02 11:00:05',1,1,1,null),(109,2002,'2021-10-03 10:59:05','2021-10-03 11:00:01',0,1,0,null),(105,2002,'2021-09-25 11:00:00','2021-09-25 11:00:30',1,0,1,null),(101,2003,'2021-09-26 11:00:00','2021-09-26 11:00:30',1,0,0,null),(101,2003,'2021-09-30 11:00:00','2021-09-30 11:00:30',1,1,0,null);INSERTINTO tb_video_info(video_id, author, tag, duration, release_time)VALUES(2001,901,'旅游',30,'2021-09-05 7:00:00'),(2002,901,'旅游',60,'2021-09-05 7:00:00'),(2003,902,'影视',90,'2021-09-05 7:00:00'),(2004,902,'影视',90,'2021-09-05 8:00:00');

📖 需求

问题:找出近一个月发布的视频中热度最高的top3视频。

注:
热度=(a*视频完播率+b*点赞数+c*评论数+d*转发数)*新鲜度;
新鲜度=1/(最近无播放天数+1);
当前配置的参数a,b,c,d分别为100、5、3、2。
最近播放日期以end_time-结束观看时间为准,假设为T,则最近一个月按[T-29, T]闭区间统计。
结果中热度保留为整数,并按热度降序排序。

🍌🍌 答案

select t1.video_id
,round(((sum(casewhen timestampdiff(second,start_time,end_time)>=duration 
      then1else0end))/count(*)*100+sum(if_like)*5+count(comment_id)*3+sum(if_retweet)*2)*1/(DATEDIFF((selectdate(max(end_time))from tb_user_video_log),date(max(end_time)))+1))as hot_index
from tb_user_video_log t1,tb_video_info t2
where t1.video_id=t2.video_id
and DATEDIFF(DATE((SELECTMAX(end_time)FROM tb_user_video_log)),DATE(release_time))<=29groupby t1.video_id
orderby hot_index desclimiT3

在这里插入图片描述

在这里插入图片描述

标签: 面试 sql 音视频

本文转载自: https://blog.csdn.net/weixin_41645135/article/details/125383783
版权归原作者 IT邦德 所有, 如有侵权,请联系我们删除。

“【牛客刷题-SQL大厂面试真题】NO1.某音短视频”的评论:

还没有评论