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

用户-视频互动表tb_user_video_log

iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id
110120012021-10-01 10:00:002021-10-01 10:00:30011NULL
210220012021-10-01 10:00:002021-10-01 10:00:21001NULL
310320012021-10-01 11:00:502021-10-01 11:01:200101732526
410220022021-10-01 11:00:002021-10-01 11:00:30101NULL
510320022021-10-01 10:59:052021-10-01 11:00:05101NULL

(uid-用户ID, video_id-视频ID, start_time-开始观看时间, end_time-结束观看时间, if_follow-是否关注, if_like-是否点赞, if_retweet-是否转发, comment_id-评论ID)

短视频信息表tb_video_info

idvideo_idauthortagdurationrelease_time
12001901影视302021-01-01 07:00:00
22002901美食602021-01-01 07:00:00
32003902旅游902021-01-01 07:00:00

(video_id-视频ID, author-创作者ID, tag-类别标签, duration-视频时长, release_time-发布时间)

问题:计算各类视频的平均播放进度,将进度大于60%的类别输出。

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

输出示例

示例数据的输出结果如下:

tagavg_play_progress
影视90.00%
美食75.00%

解:

SELECT tag, CONCAT(avg_play_progress, "%") as avg_play_progress
FROM (
    SELECT tag, 
        ROUND(
            AVG(
                IF(TIMESTAMPDIFF(SECOND, start_time, end_time) >= duration, 1,
                   TIMESTAMPDIFF(SECOND, start_time, end_time) / duration)
            ) * 100, 2
        ) as avg_play_progress
    FROM tb_user_video_log
    JOIN tb_video_info USING(video_id)
    GROUP BY tag
    HAVING avg_play_progress > 60
    ORDER BY avg_play_progress DESC
) as t_progress;
  1. 在内部查询中,我们首先将 tb_user_video_log 表和 tb_video_info 表联接,通过 video_id 列关联它们。这样,我们可以访问视频播放日志和视频信息。

  2. 我们使用 TIMESTAMPDIFF 函数来计算每个视频的实际播放时长与预期播放时长之间的差异(以秒为单位)。然后,使用 IF 函数,如果实际播放时长大于或等于预期播放时长,则返回1,否则返回实际播放时长与预期播放时长之间的比率。

  3. 在内部查询中,我们将播放进度数据按标签 (tag) 分组,然后计算每个标签下的平均播放进度,并使用 ROUND 函数将其四舍五入为两位小数。

  4. 使用 HAVING 子句筛选出平均播放进度大于60%的标签。

  5. 最后,我们在外部查询中将平均播放进度的百分比形式 (avg_play_progress) 和标签 (tag) 选择出来,使用 CONCAT 函数将百分比形式的播放进度和百分号连接在一起,并对结果的列进行命名。

知识点:

CONCAT 是 SQL 中用于连接字符串的函数,它将一个或多个字符串连接在一起,生成一个新的字符串。具体的语法如下:

CONCAT(string1, string2, ...)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值