7、刷牛客网SQL题(一)

本文详细解析了SQL挑战题目,涉及2021年视频完播率计算、播放进度统计、创作者涨粉率计算及国庆期间特定时段视频数据深度分析,以实例演示和多种思路实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目来源

牛客网SQL大厂面试题——某音短视频


一、SQL1(简单)

1、题目内容

描述
用户-视频互动表tb_user_video_log
在这里插入图片描述
短视频信息表tb_video_info
在这里插入图片描述
问题:计算2021年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序

注:视频完播率是指完成播放次数占总播放次数的比例。简单起见,结束观看时间与开始播放时间的差>=视频时长时,视为完成播放。

2、思路分析

首先看清题目要求,有以下几个点需要注意:
1)2021年有播放记录,所以要求视频的startTime里的年份要在2021年
2)结果保留三位小数
3)按完播率降序排序

看完注意事项,分析思路:
最终要求的是完播率,可以转化为求完成播放的次数和总共播放的次数。完成播放的次数要拿到对应视频的总时长和每次播放时长来进行判断,所以要先用用户-视频互动表短视频信息表进行内连接(内连接前可以先过滤出来在2021年播放的视频,减少join次数;还可以先把每个视频的播放时长给算出来)。这样得到了video_id、duration、播放时长这三个字段的一张表,题目要求的是每个视频,所以按video_id分组,count(*)的得到的是总的播放次数,count(if())可以算出来完成播放的次数,相除并保留三位小数再降序排列即可。

3、语句实现

select
    t3.video_id,
    cast(count(if(cha>=duration,1,null))*1.0/count(*) as DECIMAL(16,3)) avg_comp_play_rate
from
(
    select
        t1.video_id,
        cha,
        duration
    from
    (
        select
            video_id,
            UNIX_TIMESTAMP(end_time)-UNIX_TIMESTAMP(start_time) cha
        from tb_user_video_log
        where year(start_time)=2021
    )t1
    inner join
    (
        select
            video_id,
            duration
        from tb_video_info
    )t2
    on t1.video_id=t2.video_id
)t3
group by t3.video_id
order by avg_comp_play_rate desc

二、SQL2(简单)

1、题目内容

描述
用户-视频互动表tb_user_video_log
在这里插入图片描述
短视频信息表tb_video_info
在这里插入图片描述
问题:计算各类视频的平均播放进度,将进度大于60%的类别输出。

注:
播放进度=播放时长÷视频时长*100%,当播放时长大于视频时长时,播放进度均记为100%。
结果保留两位小数,并按播放进度倒序排序。

输出示例:
示例数据的输出结果如下:
在这里插入图片描述
解释:
影视类视频2001被用户101、102、103看过,播放进度分别为:30秒(100%)、21秒(70%)、30秒(100%),平均播放进度为90.00%(保留两位小数);
美食类视频2002被用户102、103看过,播放进度分别为:30秒(50%)、60秒(100%),平均播放进度为75.00%(保留两位小数);

2、思路分析

同样有几个点要注意:
1)播放时长大于视频时长时,播放进度记为100%
2)结果保留两位小数
3)按播放进度倒序排序

思路如下:
最后输出到结果是一个类别名称和一个播放进度,类别名称要通过两个表连接得到;播放进度要拿到每个播放的时长和每种类型的视频的时长,然后相除再按类型分组,再过滤和排序。

3、语句实现

select
    tag,
    concat(avg_rate,'%') avg_play_progress
from
(
    select
        video_id,
        tag,
        cast(avg(single_rate) as decimal(16,2)) avg_rate
    from
    (
        select
            t1.video_id,
            t2.tag,
            cast(if(cha*100.0/duration>100,100,cha*100.0/duration) as DECIMAL(16,2)) single_rate
        from
        (
            select
                video_id,
                TIMESTAMPDIFF(second,start_time,end_time) cha
            from tb_user_video_log
        )t1
        inner join
        (
            select
                video_id,
                tag,
                duration
            from tb_video_info
        )t2
        on t1.video_id=t2.video_id
    )t3
    group by video_id
)t4
where avg_rate>60
order by avg_rate desc

三、SQL3(中等)

1、题目内容

描述
用户-视频互动表tb_user_video_log
在这里插入图片描述
短视频信息表tb_video_info

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值